2022年3月

Mabox Linux 是一个 Manjaro Linux 重制版,带有一个轻量级的 Openbox 窗口管理器,已经预配置了主题和实用程序。我们将在这篇文章中点评这个发行版。

如果你喜欢窗口管理器,也喜欢基于滚动发布的 Arch Linux,并且正在寻找一个具有这种组合的现成 Linux 发行版,可以试试 Mabox Linux。Mabox Linux 是建立在很棒的 Manjaro Linux 之上的,带有 Openbox 窗口管理器和一些原生实用程序。

由于采用了 Openbox,这个 Linux 发行版在维持超轻量级的资源消耗的同时,也提供了一个漂亮的桌面。改编自 BunsenLabs,并受 Crunchbang 启发的 Mabox Linux 工具也带来了他们的一些应用。

让我们来深入了解一下这个了不起的 Linux 发行版。

Mabox Linux 点评

安装和现场介质

Mabox .ISO 的优势之一是它在 现场介质 Live medium 启动过程中为你提供了自由和专有的驱动程序的两种选择。如果你的系统中有英伟达或其他硬件,这对你有帮助。

现场桌面 Live desktop 让你可以通过 Calamares 安装程序来安装 Mabox。在标准硬件上,安装大约需要 3 到 4 分钟,在我的测试中没有遇到错误。

安装程序也会检测测试设备中的其他操作系统。

具有自定义的外观和感受

Mabox 带来了一个预配置的 Openbox 窗口管理器。这个搭配的版本看起来不错,有深色外观和带面板的菜单。

顶部的面板是用 Tint2 构建的,分成两个部分。左边的面板为你提供了主菜单、文件管理器、网页浏览器的快捷方式。面板上的鼠标左键和右键有不同的菜单。右边的面板包含资源监视器、音量控制、截屏快捷方式和电源菜单。顶部面板不是连续的,在某些主题下,应用程序窗口会停留在顶部。

Mabox Linux with Nord Theme

在桌面的右边部分,预配置的 Conky 脚本可以给你提供系统信息,包括日期、时间、存储和其他显示。

欢迎窗口为你提供了关于设置、帮助和支持的快速启动快捷方式,并有文档链接。

窗口管理器适合于键盘操作,有时不便于用鼠标操作。但由于 Openbox 和预配置的 Mabox,你可以轻松地使用鼠标,同时通过灵巧的键盘快捷方式提高你的工作效率。

桌面上的右键菜单为你提供了轻松的搜索和启动选项。

Search and Launch from desktop

如果你不喜欢默认的外观,你可以通过 Openbox 和 Tint2 面板配置工具,只需点击几下就可以自行定制。

Main Application Menu

Mabox 预设有不同的主题,包括面板和 Concky 脚本。你可以点击并应用这些令人惊叹的 Mabox 主题。如果你不想陷入自己配置面板、颜色和 Conky 的麻烦中,这是一个很好的功能。

一套好的墙纸可以让你随时让它在短时间内看起来更加美妙。

Mabox Themes

应用

Mabox Linux 将所有必要的应用打包在其安装镜像中。以下是所包含的基本应用的简单列表。

  • Terminator 终端
  • Xpad 快速写字板
  • PCManFM 文件管理器
  • FSearch 桌面文件搜索
  • Flameshot 截图工具
  • Geany 文本编辑器
  • Audacious 音乐播放器
  • Firefox 网页浏览器

Mabox 还包括控制中心,以有效管理你的系统。Mabox 控制中心可以让你添加/删除应用、更新你的系统、启动窗口管理组件的几个配置窗口,诸如此类。

如果你找不到某个设置,你可以在 Mabox 控制中心通过其系统设置的逻辑分组轻松找到它们。

Mabox Control Center

性能如何?

Mabox Linux 的性能令人印象非常深刻。由于采用了 Openbox 窗口管理器,Mabox 只用了大约 350MB 多点的内存,而 CPU 在空闲状态下徘徊在 2% 到 3%。

默认安装需要大约 5.39GB 的磁盘空间,这对于预装的这些应用和设置程序来说是不可思议的。

在如此优化下,以至于它消耗内存最多的应用是 Xorg,有 90MB。

所以,我想尝试一下重度使用下的性能。而这个性能也是令人惊讶的。我打开了一个文件管理器、带三个标签的 Firefox、一个用于开发的文本编辑器、一个终端窗口和控制中心。在这样的工作负荷下,Mabox 只消耗了大约 920MB 的内存和 6% 到 7% 的 CPU。

Mabox Linux Heavy Workload Performance

点评几个发行版 的过程中,这是我第一次发现一个发行版在重度工作负荷下不超过 1GB 内存的情况。但在不同的使用情况下,结果可能有所不同。无论如何,这个指标还是令人印象深刻。

Mabox Linux 可以作为日常使用吗?

如果你对带有窗口管理器的 Arch Linux 比较熟悉和适应,你可以把 Mabox Linux 作为日常使用。有几个打包好的带有窗口管理器的 Arch Linux 发行版,而 Mabox 是其中最好的一个。

Mabox Linux Windows 95 pre-configured theme

总结

我认为 Mabox Linux 团队将所有组件与 Arch Linux 打包在一起,并呈现出一个漂亮的 Linux 发行版,做得非常好。它的外观惊艳,而消耗的系统资源却很少。有了基于 Arch Linux 的滚动发布功能,我认为你可以信赖这个发行版的长期使用。

你可以从它的 官方网页 下载 Mabox Linux。


via: https://www.debugpoint.com/2022/03/mabox-linux-2022/

作者:Arindam 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文介绍了几种端口转发最常见的使用场景。

 title=

端口转发就是把网络流量从一个网络监听者(称为一个“端口”)发送到另一个上,无论这两个端口是否属于同一台电脑。在这里,端口不是某个物理实体,而是一个监听网络活动的软件程序。

当流量被定向发往到某个特定的端口,它会先到达一个路由器或是防火墙,亦或是其他的网络程序。它最终收到的响应可能会根据它想要通讯的端口来定义。比如,当你使用端口转发时,你可以捕获到发往 8080 端口的流量,然后把它转发到 80 端口。对于接收信号的原端口来说,这个新的目标端口可能和它在同一台设备上,也可能是在另一台设备上。我们在很多情况下都会用到端口转发,实现的方式也有很多。本文将介绍其中最常见的几种使用场景。

使用路由器来进行端口转发

如果你在把服务器架设在家里,那么你通常是不需要转发端口的。你的家庭路由器(通常是你从 网络服务提供商 Internet Service Provider (ISP)获得的 WiFi 设备)有一个内置的防火墙,它的作用是阻止外面的世界访问到你的家庭网络。通过使用端口转发,你可以允许某个指定端口的流量穿过路由器的防火墙,并发送到局域网中的某个指定的 IP 地址。

比如说,你架设了一个 Minetest 服务,并想要邀请你的朋友们来试试。为了让他们能够“穿过”你的路由器,从而到达这个 Minetest 服务,你必须把路由器上的某个端口转发到托管 Minetest 服务的电脑上。Minetest 服务默认运行在 30000 端口。你可以把路由器的 30000 端口转发到你的电脑的 30000 端口上,或者你也可以随便转发到一个更简单的端口上,这样玩家们会更容易记住它。我发现,当使用 30000 端口的时候,人们时常会少数几个 0(特别是没有逗号分隔符的帮助时),所以我一般使用路由器的 1234 端口,然后把它转发到我内部的 30000 端口。

每个制造商的路由器接口都不一样,但是不管你用的是什么牌子的路由器,方法都是相同的。首先,你需要登录到你的路由器。

通常,路由器的 IP 地址和登录信息都会打印在路由器上,或者在是它的文档里。我有一个型号为 TP-Link GX90 的路由器,我在浏览器里访问 10.0.1.1 就可以登录它,但你的路由器可能是 192.168.0.1 或者其他的地址。

我的 GX90 路由器把端口转发功能称为“ 虚拟服务器 virtual servers ”,它是路由器的“NAT 转发”标签下的一个功能选项。NAT 的意思是 “ 网络地址转换 Network Address Translation ”。在其他路由器中,这个功能可能直接就叫做“端口转发”,或者叫“防火墙”、“服务”等。找到正确的功能选项可能需要花费一些时间,因此,你可能需要花点时间研究下你的路由器文档。

当你找到了路由器的端口转发设置,添加一个新规则,命名一个外部端口(在我的例子中是 1234)和一个内部端口(30000)。把外部端口转发到内部端口上,而内部端口绑定在你想要大家访问的电脑的 IP 地址上。如果你需要一些查询本机 IP 地址的帮助,你可以阅读 Archit Modi 写的 《在 Linux 上如何查询本地 IP 地址》。

 title=

一个简单端口转发规则

(图片提供者是 Seth Kenlon,遵循 署名-相同方式共享 4.0 国际 协议)

在这个例子中,访问家庭网络的 1234 端口的流量,都会被转发到了我的家庭服务器的 30000 端口上,后者的 IP 地址是 10.0.1.2。

在继续之前,先保存这个规则。

接下来,你需要知道你的家庭网络的公网 IP 地址是多少。你可以从 ifconfig.me 或者 icanhazip.com 上获得这个地址。你可以在浏览器中打开这两个网站的其中一个,也可以使用 curl 命令来获取到这个 IP。

$ curl ifconfig.me
93.184.216.34

现在,你的朋友们就可以在 Minetest 客户端里输入 169.169.23.49:1234,加入你的 Minetest 服务器啦。

使用防火墙来进行端口转发

系统管理员有时候需要转发访问服务器的流量。比如说,你可能想要接收来自 80 端口的流量,但是用户的服务却运行在 8065 端口。如果不进行端口转发的话,你的用户就不得不在输入浏览器的 URL 末尾,加上一个指定的端口号,例如 example.com:8065。大多数用户都不习惯于考虑端口的问题,所以你需要把访问网络通用的 80 端口的请求拦截下来,然后转发到你的网络应用的具体端口,这会给用户带来巨大的方便。

你可以在服务器上使用 firewall-cmd 来转发流量,它是访问 firewalld 后台进程的 前端 front-end 命令。

首先,设置好你想要转发的端口和协议:

$ sudo firewall-cmd \
    --add-forward-port \
    port=80:proto=tcp:toport=8065

为使修改永久生效,你需要加上 --runtime-to-permanent 选项:

$ sudo firewall-cmd --runtime-to-permanent

网络转发

在网络传输中,除了端口转发外,还有其他种类的 转发 forwarding 形式,例如 IP 转发和代理等。当你熟悉了网络信息在路由时是怎么被处理的之后,你可以试试不同的转发形式(然后使用 tcpdump 或类似的工具)来看看哪一种最好、最符合你的需求。


via: https://opensource.com/article/21/9/what-port-forwarding

作者:Seth Kenlon 选题:lujun9972 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这是一个有趣的工具,可以轻松地访问文件或打开链接。让我们来了解一下。

对于那些涉足使用多个应用访问不同文件和使用各种浏览器打开链接的用户来说,其工作流程往往没那么多顺畅。

你可能已经习惯了,但这可能不是完成事情的最快方式。

认识一下 Junction,这是一个应用切换器,帮助你用最喜欢的应用快速打开文件/链接。

Junction: 开源的 Linux 应用或浏览器切换器

虽然我们可以在打开文件时使用右键菜单中的 “用……打开” 选项来选择某个应用,但这并不是最快的方法。

有了 Junction,你不必寻找希望用什么程序打开该文件(或不断改变默认值),而只需将 “Junction” 应用设置为你的默认值。

这样,每当你打开一个链接或访问一个文件、启动电子邮件编辑器等,Junction 应用就会启动,向你显示你可能想要访问的相关应用。

此外,它还支持键盘导航,使其成为键盘高级用户的一个有益补充。

基本上,每次你想在不同的应用中访问文件/链接时,它都能为你节省一些点击次数。

Junction 的特点

它是一个适合于特定用户群的简单工具。你可能觉得它是多余的,也可能不是,但在你想尝试的情况下,它的功能应该可以弥补它的不足:

  • 通过启动器/切换器选择要打开的应用
  • 在启动前显示文件位置
  • 在打开 URL 之前能够编辑它
  • 提示不安全的链接
  • 键盘导航
  • 能够在切换器/启动器中添加更多的应用(它也会记住添加的内容,以便下次使用)

使用 Junction 来访问文件和链接

要设置它,你需要启动应用并将 Junction 设置为 Web 的默认值,如下图所示。

要在任何文件类型上使用它,你可以前往各自的文件属性,并为它改变默认的应用,如下图所示:

对于链接,如上面的截图所示,你可以通过点击 “Test Junction” 来测试它。或者,你可以点击其他应用的任何链接,看看 Junction 应用的运行情况。

下面是你试图点击一个链接并让 Junction 帮助你选择时的情况:

在 Linux 中安装 Junction

Junction 主要以 Flatpak 应用的形式提供。因此,你可以从 Flathub 安装软件包,或者在软件中心寻找它(如果 Flatpak 集成完毕)。

考虑到你已经设置了 Flatpak,你可以输入以下命令来安装它:

flatpak install flathub re.sonny.Junction

你也可以查看它的 GitHub 页面,了解更多的使用案例或利用它的技巧/窍门。

你认为像 Junction 这样的应用切换器怎么样?它对你有用吗?请在下面的评论中告诉我你的想法,或简单的一句“谢谢”。


via: https://itsfoss.com/junction/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

气候运动意图推动比特币网络放弃高能耗的代码

一些环保组织发起了一个 新的运动,通过各大媒体宣传施加压力,意图推动比特币网络削减其日益增长的温室气体排放。比特币网络专门采用消耗大量能源的工作量证明方式(PoW)来维护其网络的安全。该活动的目的是让比特币网络放弃 PoW ,而采用股权证明方式(PoS)。使用 PoS 的加密货币使用的能源大大减少,但参与者必须提供自己的抵押通证,以担保其参与的活动。虽然 PoS 可能会解决比特币的很多污染问题,但专家们对矿工们是否愿意做出改变持怀疑态度。矿工们在硬件上投资了很多,很难放弃它。而一些 PoW 的拥护者认为,这是维护分布式账本的最安全方式。

老王点评:这是一方面舍不得比特币网络的财富,另一方面又想营造环保概念。我就说一点,目前为止,没有任何 PoS 的区块链项目算得上成功。

Chrome 100 正式发布

在这个看起来应该是里程碑的 新版本 里,除了换了新的徽标,以及版本号变成了三位数,没有什么特别值得一提的新功能变化。这是因为谷歌每月向 Chrome 浏览器渐进式地添加新功能,而不是大规模的发布,另外许多更新的功能是在服务器端提供的。更新后的徽标设计在 2 月份首次发布了预览,采用了简化的设计,颜色更亮,取消了阴影。Chrome 的设计师 Elvin Hu 说,更新的设计是为了与 “Google 更现代的品牌表达”相一致。

老王点评:似乎 100 版本号就这样悄悄来了,也没引起啥问题。

谷歌文档添加 Markdown 支持

它是通过自动更正功能来实现的,因此在你以 Markdown 格式输入文字后,它会自动为你格式化。谷歌文档已经支持一些 Markdown 标记,如各级标题、列表、复选框、粗体、斜体、链接等。不过,它不是在纯文本中显示你的标记,而是用它们来自动应用格式化,然后再把标记删除。这与大多数 Markdown 编辑器默认显示的方式不同:通常情况下,你仍然能够看到标记,编辑器也会添加一些格式化的东西,让你知道在你发布时它会是什么样子。谷歌说可能需要“超过 15 天”的时间来为每个人 提供这个功能

老王点评:我觉得 Markdown 真是一个神奇的发明,谷歌能想到将其作为不需要菜单的格式化快捷方式,也很有意思。

回音

  • 在去年 12 月 测试 了一键改变默认浏览器的功能后,微软终于 正式 对 Windows 11 发布补丁提供了该功能。

我们做了一次尝试,使 LibreOffice 套件看起来像微软 Office。能做到吗?让我们来看看。

LibreOffice 是一个自由开源的办公生产力套件,它向你提供了一套完整的应用程序集合。它包含文字处理器(Writer)、电子表格程序(Calc)、演示程序(Impress)和 绘图程序(Draw)。它还为你提供了一个独立的数据库系统(LibreOffice Base),以及 LibreOffice Math 是一个帮助学生、研究人员编写公式和方程的程序。

然而,广泛使用的 微软 Office 是一个付费的办公生产力套件,提供了优秀的程序来完成几乎所有的关于学习、办公和企业应用的任务。

这两组程序套件是不同的,但是它们在功能方面的目标是相同的。由于它的流行,微软 Office 被广泛的使用,并被使用者熟知。不过,这里有很多使用者更喜欢免费的 LibreOffice 来支撑他们的工作和活动。与微软 Office 相比,采用 LibreOffice 有时会很困难 —— 尽管大多数的菜单项和工具都是一样的。

尽管如此,如果你可以使 LibreOffice 看起来像微软 Office ,那么,对于初次使用 LibreOffice 的用户来说会更容易接纳,他们大多数是有使用微软 Office 的经历背景的用户。外观和感受在用户的头脑中起着重要的作用,也包含他们的肌肉记忆和对颜色、菜单项的熟悉度。

当然,你不可能使它完全像微软 Office,因为它们使用了不同的图标、字体等等。不过,你可以将其微调到一定程度。

使 LibreOffice 看起来像微软 Office

这篇指南是以 LibreOffice 7.2(开发版)版本为基础所编写的。

1、用户界面的变化

LibreOffice 有一个名为“标签栏” 的 “ 功能区 Ribbon ” 式工具栏。尽管它带有多种工具栏变体(如下)。但是,对于这篇指南,我使用 标签式 Tabbed 工具栏选项。

  • 打开 LibreOffice 并转到 “ 菜单 Menu > 视图 View > 用户界面 User Interface ”。
  • 从 UI 部分中选择 “ 标签式 Tabbed ” 。

tabbed bar option

  • 点击 “ 应用于全部 Apply to All ” 。LibreOffice 也提供一个选项,可以将特定的工具栏样式应用到 Writer 或 Calc。如果你想要一种不同的工具栏样式,你可以选择这种方法。但是,我推荐使用应用于全部来使其保持一致。
  • 现在,你已经有了微软 Office 样式的功能区。尽管它们并不是完全相同,但是你也能体会到它的感受。

2、适用于 LibreOffice 的微软 Office 图标

工具栏中的图标在你的工作流中起着重要的作用。LibreOffice 为你的工具栏提供一些漂亮的图标。其中最好的一些是:

  • Karasa Jaga
  • Colibre
  • Elementary

针对这篇指南,我们将使用 Office 2013 图标集,它是由一名作家开发的,可以在 Devian Art 中获得。

  • 转到下面的链接并下载 LibreOffice 扩展文件(*.oxt),对于 LibreOffice 的较新版本,你需要使用扩展文件来安装图标集。
+ [下载适用于 libreoffice 的 Office 2013 图标集](https://www.deviantart.com/users/outgoing?https://1drv.ms/u/s!ArgKmgFcmBYHhSQkPfyMZRnXX5LJ)
  • 在下载后,双击 .oxt 文件来将其打开。或者,按下 CTRL+ALT+E 组合按键来打开扩展管理器,并使用 “ 添加 Add ” 按钮来选择已下载的 .oxt 文件。在完成后关闭窗口。

Import icon sets in Extension Manager

  • 现在,转到 “ 工具 Tools > 选项 Options > 视图 View ”。从“ 图标样式 Icon Style ”中选择 “Office 2013” 。
  • 通过 “ 图标大小 Icon Size > 笔记本栏 Notebookbar > Large ” 来更改图标大小。如果你感觉图标有点小,你可以更改它们。不过,我觉得要使它更像 Office ,将图标设置的较大一点的效果会更好。

Change icons in Options

就这样,你的 LibreOffice 应该看起来像这样:

在 KDE Plasma 中让 LibreOffice 看起来像微软 Office

在 Windows 10 中让 LibreOffice 看起来像微软 Office

在 GNOME 中让 LibreOffice 看起来像微软 Office

注意,如果你正在使用 Ubuntu、KDE Plasma,或者任何 Linux 发行版,它们的外观可能会有所不同。但是,在我看来,在 KDE Plasma 中比在 GNOME 中看起来更像微软 Office 。LibreOffice 目前在基于 GTK 的系统中看起来并不太好。

不过,在 Windows 中,它看起来会更像,因为它使用同一个系统的字体和颜色面板。

这些是你可以使用的一些设置,不过,你可以随心所欲地自由调整更多的定制、图标和主题。如果你喜欢 LibreOffice 的深色模式,你可能想要阅读我们的教程 – 如何在 LibreOffice 中启用深色模式

结束语

微软 Office 毫无疑问是办公生产力领域的市场领导者。这是有原因的,它来自数十年的开发。它不是免费的产品,事实上,最新的 Office 365 家庭版本的价格大约是 7 美元/月,可以在 3 到 4 台设备上使用。在我看来,它有点小贵。

然而 LibreOffice 是免费的,由文档基金会领导的社区开发。因此,开发速度较慢、功能出现也较晚。它并不是要成为微软 Office ,而是要给数以百万计的用户、学校、非营利组织、高校、学生一个使用免费办公套件工作和学习的机会。

因此,如果它能够模仿基本的外观和感受,使其像微软 Office 一样,从而调高 LibreOffice 的使用率,那将是有益的。我希望这篇指南能在这个方向上能起到一点作用。


via: https://www.debugpoint.com/2021/06/libreoffice-like-microsoft-office/

作者:Arindam 选题:lujun9972 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

首先在 Java 中创建初始化一个整数列表,然后在 Groovy 中做同样的事。

 title=

我非常喜欢 Groovy 编程语言。我喜欢它是因为我喜欢 Java,尽管 Java 有时候感觉很笨拙。正因为我是那么喜欢 Java,其他运行在 JVM 上语言都不能吸引我。比方说 Kotlin、Scala 还有 Clojure 语言,它们感觉上就和 Java 不一样,因为它们对于什么是好的编程语言的理解不同。Groovy 和它们都不一样,在我看来,Groovy 是一个完美的选项,特别是对于一部分程序员来说,他们喜欢 Java,但是又需要一个更灵活、更紧凑,并且有时候更直接的语言。

列表 List 这种数据结构是一个很好的例子,它可以容纳一个无序的列表,列表中的元素可以是数字、字符串或者对象,程序员可以用某种方式高效地遍历这些元素,特别是对于编写和维护脚本的人来说,“高效”的关键就是要有简洁清晰的表达,而不需要一大堆“仪式”,把代码的意图都变模糊了。

安装 Java 和 Groovy

Groovy 是基于 Java 的,因此需要同时安装一个 Java 才行。你的 Linux 发行版的仓库中可能有最近的比较好的 Java 版本。或者,你也可以在根据 这些指导 来安装 Groovy。对于 Linux 用户来说,SDKMan 是一个不错的代替选项,你可以使用它来获取多个 Java 和 Groovy 版本,以及许多其他的相关工具。在这篇文章中,我使用的 SDK 发行版是:

  • Java: OpenJDK 11 的 11.0.12-open 版本
  • Groovy: 3.0.8 版本

言归正传

Java 中有很多方法可以实例化并初始化列表,从它最初被引入的时候就有了(我记得是在 Java 1.5 的时候,但请不要引用我的话)。在这些方法里,有两个有趣的方法,它们涉及到了 java.util.Arraysjava.util.List 这两个类。

使用 java.util.Arrays 类

java.util.Arrays 类定义了一个 asList() 静态方法,它可以被用来创建一个基于数组的列表,因此大小是不可变的,尽管其中的元素是可以被修改的。下面是它的使用方式:

var a1 = Arrays.asList(1,2,3,4,5,6,7,8,9,10); // immutable list of mutable elements

System.out.println("a1 = " + a1);
System.out.println("a1 is an instance of " + a1.getClass());

// output is
// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// a1 is an instance of class java.util.Arrays$ArrayList

a1.set(0,0); // succeeds
System.out.println("a1 = " + a1); // output is
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]

a1.add(11); // fails producing
// Exception in thread "main" java.lang.UnsupportedOperationException
System.out.println("a1 = " + a1); // not reached

使用 java.util.List 类

java.util.List 类定义了一个 of() 静态方法,它可以被用来创建一个不可变的列表,其中的元素是否可变要取决于它们本身是否支持修改。下面是它的使用方式:

var a2 = List.of(1,2,3,4,5,6,7,8,9,10);

System.out.println("a2 = " + a2);
System.out.println("a2 is an instance of " + a2.getClass());

// output is
// a2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// a2 is an instance of class java.util.ImmutableCollections$ListN

a2.set(0,0); // fails producing
// Exception in thread "main" java.lang.UnsupportedOperationException
System.out.println("a2 = " + a2); // not reached

a2.add(11); // also fails for same reason if above two lines commented out
System.out.println("a2 = " + a2); // not reached

因此,我可以使用 Arrays.asList(),也可以使用 List.of() 方法,前提是如果我想要的是一个大小不能改变、且不关心元素是否可变的列表。

如果我想要初始化一个可变的列表,我更倾向于把这些不可变的列表作为参数传给一个列表构造器,就像下面这样:

var a1 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));

System.out.println("a1 = " + a1);
System.out.println("a1 is an instance of " + a1.getClass());

// output is
// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// a1 is an instance of class java.util.ArrayList

a1.set(0,0);
System.out.println("a1 = " + a1);

//output is
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]

a1.add(11);
System.out.println("a1 = " + a1);

// output is
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

注意,这个 Arrays.asList() 方法是用来初始化这个新的 ArrayList<Integer>() 的,也就是说,它为这个传进来的列表创建了一个可变的拷贝。

现在,或许只有我这么想,但是这种方式确实看起来需要理解很多关于 java.util.Arraysjava.util.List 类的细节才行,而我只是想要创建并初始化一个数字列表而已(尽管真正使用到的语句并没有太多“仪式”)。下面是真正用到的那行代码,仅供参考:

var a1 = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));

Groovy 是怎么做的

下面来看看在 Groovy 中如何实现上述需求:

def a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

println "a1 = $a1"
println "a1 is an instance of ${a1.getClass()}"

// output is
// a1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// a1 is an instance of class java.util.ArrayList

a1[0] = 0
println "a1 = $a1"

// output is
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]

a1 << 11
println "a1 = $a1"

// output is
// a1 = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

我们一眼就能发现,Groovy 使用了 def 关键字而不是 var 关键字。我还发现了,仅仅是把一系列的类型(在这个例子里是整数)放进括号里,我就得到了一个创建好的列表。此外,这样创建出来的列表完全就是我想要的:一个可变的 ArrayList 实例。

现在,或许再一次只有我这么想,但是上面的代码看起来要简单多得多 —— 不用记住 .of().asList() 返回的是“ 半不变 semi-mutable ”的结果,也不用为它们做一些补偿。另外一个好处是,我现在可以使用括号和下标来引用列表中的某个特定元素,而不用这个叫 set() 方法。另外,这个跟在列表后面的 << 操作符也很方便,我再也不用调用 add() 方法来添加元素啦。还有,你注意到代码中没有分号了吗?没错,在 Groovy 里,句末的分号并不是必须的。最后,我们来看看字符串插值,只要在字符串里用 $变量 或者 ${表达式} 就可以实现了哦!

在 Groovy 世界中还藏着许多“有待发掘”的东西。上面的列表定义其实是一个动态类型(Groovy 中默认)和 Java 中的静态类型的对比。在上面的 Groovy 代码定义的那一行,变量 a1 的类型是在运行的时候,根据等号右边的表达式的计算结果推断出来的。现在我们都知道,动态语言可以给我们带来强大的功能,有了强大的功能,我们有了很多机会去尝试不同的东西。对于那些不喜欢动态类型的程序员来说,Groovy 也支持静态类型。

Groovy 相关资源

Apache Groovy 网站上有非常多的文档。另一个很棒的 Groovy 资源是 Mr. Haki。学习 Groovy 还有一个很棒的原因,那就是可以接着学习 Grails,后者是一个优秀的、高效率的全栈 Web 框架,基于许多优秀组件构建而成,比如有 Hibernate、Spring Boot 和 Micronaut 等。


via: https://opensource.com/article/22/1/creating-lists-groovy-java

作者:Chris Hermansen 选题:lujun9972 译者:lkxed 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出