开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

Java 从一个 List 中删除 null 元素

概述 本文章主要是为了展示如何从一个 List 列表中删除所有的 null 元素。 在本文中,我们使用了下面的几个实现: 纯 Java Guava Apache Commons Collections Java 8 提供的 lambda 表达式 使用纯 Java 来将 List 中的 null 元素删除 Java 中的 Collections 框架提供了一个简单的解决方案: 基于使用 while 循环将 List 列表中的所有空元素进行删除。 @Test public void givenListContainsNulls_whenRemovingNullsWithPlainJava_thenCorrect() { final List<Integer> list = Lists.newArrayList(null, 1, null); while (list.remove(null)); assertThat(list, hasSize(1)); } 可选的,我们可以使用一个更加简单的方法,使用 list 中使用 removeAll 的方法来将 null 删除。 @Test public void givenListContainsNulls_whenRemovingNullsWithPlainJavaAlternative_thenCorrect() { final List<Integer> list = Lists.newArrayList(null, 1, null); list.removeAll(Collections.singleton(null)); assertThat(list, hasSize(1)); } 需要注意的是,上面 2 个方法将会对输入的 List 进行修改。 在删除后得到的 list 是修改后的list 使用 Guava 我们还可以使用 Guava 的方法来进行 null 的查询和处理,这个需要通过 Java 的 predicates。 @Test public void givenListContainsNulls_whenRemovingNullsWithGuavaV1_thenCorrect() { final List<Integer> list = Lists.newArrayList(null, 1, null); Iterables.removeIf(list, Predicates.isNull()); assertThat(list, hasSize(1)); } 如上面使用的代码,首先需要对 List 进行遍历,Iterables。List 对 Guava 来说是 Iterables。 然后使用 Predicates.isNull() 来进行判读。 如果为 NULL 就删除。     如果你不希望对输入的 List 进行修改的话,你可以使用 Guava 提供的 Iterables.filter 方法来进行遍历和处理。 如下面的代码,只需要将 removeIf 换成 filter 就可以了。 @Test final List<Integer> list = Lists.newArrayList(null, 1, null, 2, 3); final List<Integer> listWithoutNulls = Lists.newArrayList(Iterables.filter(list, Predicates.notNull())); assertThat(listWithoutNulls, hasSize(3)); } 使用 Apache Commons Collections Apache Commons Collections 的使用和 Guava 的使用是类似的。 虽然 Apache Commons Collections 使用了 filter 方法,但是需要注意的,上面的方法会对输入的 List 进行修改。 @Test public void givenListContainsNulls_whenRemovingNullsWithCommonsCollections_thenCorrect() { final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null); CollectionUtils.filter(list, PredicateUtils.notNullPredicate()); assertThat(list, hasSize(3)); } Java 8 Lambdas 表达式 Java 8 提供了 Lambdas 表达式来对 null 进行处理。 这个处理可以是并行的,也可以是序列进行的。 请查看下面的代码: @Test public void givenListContainsNulls_whenFilteringParallel_thenCorrect() { final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null); final List<Integer> listWithoutNulls = list.parallelStream().filter(Objects::nonNull).collect(Collectors.toList()); assertThat(listWithoutNulls, hasSize(3)); } @Test public void givenListContainsNulls_whenFilteringSerial_thenCorrect() { final List<Integer> list = Lists.newArrayList(null, 1, 2, null, 3, null); final List<Integer> listWithoutNulls = list.stream().filter(Objects::nonNull).collect(Collectors.toList()); assertThat(listWithoutNulls, hasSize(3)); } @Test public void givenListContainsNulls_whenRemovingNullsWithRemoveIf_thenCorrect() { final List<Integer> listWithoutNulls =…

2022年05月01日 0Comments 621Browse 0Like Read more
Computer Science

Gitea 的简单介绍

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 在这个领域,名气最响的应该是 Gitlab。 但实际使用中Gitlab也有点问题,首先就是资源占用。Gitlab 是使用 ruby 编写的,好几年之前刚出来的时候,一台1G内存的虚拟主机连安装运行都做不到,着实震惊。 时至今日都已经发展到了以docker镜 像分发,gitlab 仍旧会有体积和运行时资源占用的问题。另一点就是功能,对于一般标准团队来说,gitlab的功能太过于丰富,这是往好的地方说,往坏的地方说就是它包含了太多不需要的东西,而这些东西还占用磁盘和运行时资源。 同时 Gitlab 的许可证政策对新的用户也不是非常友好,主要在于与其他平台的同步上面。 例如有一个下面的场景:你将代码提交到自己的服务器上后,如果希望能够自动同步到其他的平台上,比如 GitHub 或者从其他平台上镜像回来,Gitlab 的社区版本是做不到的。 你需要使用企业版本,企业办法的收费是一个用户 5 美元,就算用户不再提交代码了,或者你的员工已经离职了,这个许可证也没有办法收回。 于是着手查看开源的可选方案,很快就找到了golang 研发的gitea。 使用golang研发的软件分发都很容易,体积小,安装使用简单,运行时占用资源少。 且gitea的功能很完备。 Gitea 和 Gogs 的关系 Gitea 其实是 Gogs 的一个分支。 这 2 个都有国人的参与,只是 Gogs 可能开发理念和 Gitea 有所不同,感觉社区上面的参与度不高。 同时 Gogs 更新速度较慢,因此可能选择 Gitea 会多一些。 我们也选择使用了 Gitea 。 Gitea 与其它 Git 托管工具的横向对比 这里列出了 Gitea 与其它一些 Git 托管工具之间的异同,以便确认 Gitea 是否能够满足您的需求。 请注意,此列表中的某些表项可能已经过时,因为我们并没有定期检查其它产品的功能是否有所更改。     使用界面 使用界面的情况如下:     你可以直接对你的代码库进行提交。 https://www.ossez.com/t/gitea/13938

2022年04月30日 0Comments 977Browse 0Like Read more
Computer Science

Postman 如何删除一个工作空间

Postman 删除工作空间的地方比较隐蔽。 在你打开工作空间后,选择工作空间的设置。     在后续的页面中,将会提示你是否选择删除这个工作空间。     在随后的页面中,提示你输入工作空间的名字,然后单击确定删除即可。   https://www.ossez.com/t/postman/13936

2022年04月30日 0Comments 732Browse 0Like Read more
Computer Science

Fedora 上如何安装 gitea

Gitea 是由 Gi t支持的另一种开源,自托管版本控制系统。 Gitea用Golang编写,是可在任何平台上托管的轻量级解决方案。 换句话说就是你希望自己部署一个 Git 远程库,但是你又不想用 GitHub,GitLab 又太重,同时还收费。 配置环境 在安装 Gitea 之前,需要对你的服务器环境进行一些配置。 Git 确保你已经在服务器上安装了 Git。 使用命令: git --version 来查看安装 Git 的版本。 如果没有安装的话,可以使用:sudo dnf install git 来进行安装。 获得 Gitea 安装包 你可以到官方的下载页面中获得最新的安装包。 在当前,最新的版本为 1.16.6 运行下面的命令来获得最新的安装包: wget -O gitea https://dl.gitea.io/gitea/1.16.6/gitea-1.16.6-linux-amd64 chmod +x gitea 创建 gitea 运行的用户 直接运行下面的命令来创建这个服务运行需要的用户。 adduser \ --system \ --shell /bin/bash \ --comment 'Git Version Control' \ --user-group\ --create-home \ --home /home/git \ git 准备 gitea 运行的目录 直接运行下面的命令来准备 gitea 运行需要的目录。 mkdir -p /var/lib/gitea/{custom,data,log} chown -R git:git /var/lib/gitea/ chmod -R 750 /var/lib/gitea/ mkdir /etc/gitea chown root:git /etc/gitea chmod 770 /etc/gitea  针对用户 git,目录 /etc/gitea 被临时设置为可写权限了。 在完成安装后,你可以使用下面的命令: chmod 750 /etc/gitea chmod 640 /etc/gitea/app.ini 来修改权限为不可写的权限。 配置环境变量 设置 gitea 的环境运行变量:GITEA_WORK_DIR 使用的命令是: export GITEA_WORK_DIR=/var/lib/gitea/ 拷贝程序文件 将运行需要的文件,拷贝到我们准备好的目录中。 使用的命令为: cp gitea /usr/local/bin/gitea 运行 Gitea 在完成上面的操作后,你有 2 种方法来运行 gitea。 这 2 种方法分别为以服务方式和命令行方式。 如果你是以命令行方式运行的话,那么在你关闭控制台以后,gitea 将会停止运行,因此我们推荐使用以服务的方式来运行。 以服务方式 以服务方式的运行,请按照下面的步骤进行: 设置启动配置文件 将 gitea/gitea.service at main · go-gitea/gitea · GitHub 文件中的内容拷贝到 /etc/systemd/system/gitea.service 文件中。 随操作启动 运行下面的命令,我们可以配置服务随操作系统启动而启动。 sudo systemctl enable gitea sudo systemctl start gitea 校验安装 Gitea 默认的启动端口是 3000。 如果你的服务器没有安装防火墙,没有配置反向代理的话,你可以通过浏览器访问服务器的 IP 地址,并且端口号是 3000。 如果你能够看到下面的界面的话,说明 Gitea 的启动已经完成了。 你需要为你的服务配置数据库服务器,并且在这个界面中完成配置就可以开始使用了。     如果你的数据库配置没有问题,并且上面的参数都填写正确的话。     就可以继续进行安装了,安装通常不需要多长时间,1 到 2 分钟就可以了。 安装成功后,你就能看到上面的界面了。 当然你还可以为你的服务器配置反向代理,开放 80 或者 443 端口以增强安全性。   https://www.ossez.com/t/fedora-gitea/13935

2022年04月30日 0Comments 605Browse 0Like Read more
Computer Science

Java 如何从一个 List 中随机获得元素

概述 从一个 List 中随机获得一个元素是有关 List 的一个基本操作,但是这个操作又没有非常明显的实现。 本页面主要向你展示如何有效的从 List 中获得一个随机的元素和可以使用的一些方法。 选择一个随机的元素 为了从一个 List 中随机获得一个元素,你可以随机从 List 中获得一个索引的下标。 然后你可以使用这个随机的下标使用方法 List.get() 来随机获得元素。 使用这个方法的要点就是,随机生成的下标不要超过 List’s 的大小,否则你将会遇到溢出的异常。 单一随机元素 为了获得随机下标,你可以使用 Random.nextInt(int bound) 方法。 考察下面的代码: public void givenList_shouldReturnARandomElement() { List<Integer> givenList = Arrays.asList(1, 2, 3); Random rand = new Random(); int randomElement = givenList.get(rand.nextInt(givenList.size())); } 如果你不想使用 Random 类,你可以使用 Math.random() 这个静态方法,然后将生成的随机数乘以 List 的大小。 (Math.random())将会生成 Double 的随机变量。 这个随机变量的区间在 0 和 1 之间,这个变量包含 0,但是不包含 1。     在完成上面的转换后,不要忘记需要讲获得的下标转换为 int 类型。 在多线程环境中选择随机下标 在多线程环境中,如何使用单一的 Random 类实例,将会导致可能在这个实例中每一线程都访问到相同的结果。 我们可以使用 ThreadLocalRandom 类来为每一线程创建一个新的实例。 如下面的代码能够保证在多线程中不出现相同的随机下标。 int randomElementIndex = ThreadLocalRandom.current().nextInt(listSize) % givenList.size(); 可以重复选择元素 有时候,你可能希望从 List 中选择一些元素,但是这些选择的元素是可以重复的。 需要的操作也非常简单,需要多少就选多少,使用一个循环来做就可以了。 如下面的代码,直接使用循环。 public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() { Random rand = new Random(); List<String> givenList = Arrays.asList("one", "two", "three", "four"); int numberOfElements = 2; for (int i = 0; i < numberOfElements; i++) { int randomIndex = rand.nextInt(givenList.size()); String randomElement = givenList.get(randomIndex); } } 选择不重复的元素 如果你希望你选择的元素是不重复的话,你可以在选择后将选择后的元素从 List 中移除。 需要注意的是担心下标的溢出。 例如你的 List 长度是 10, 但是你希望从这 List 中选择 11 个不重复的元素,这是没有办法做到的。 通常会抛出异常。 public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() { Random rand = new Random(); List<String> givenList = Lists.newArrayList("one", "two", "three", "four"); int numberOfElements = 2; for (int i = 0; i < numberOfElements; i++) { int randomIndex = rand.nextInt(givenList.size()); String randomElement = givenList.get(randomIndex); givenList.remove(randomIndex); } } 选择一个随机序列 这个方法的主要目的是将给出的 List 进行打乱,并且获得一个相同的随机序列。 当然你也可以使用循环来做,如果你使用 Collections 工具类能够更好的帮助你完成这个目标: public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() { List<Integer> givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6); Collections.shuffle(givenList); int randomSeriesLength = 3; List<Integer> randomSeries = givenList.subList(0, randomSeriesLength); } 结论 在本页面中,我们对 List 中的元素随机进行输出进行了一些探讨。 通过上面的内容,能够更好的帮助你了解有关 List 中的随机输出等情况。   https://www.ossez.com/t/java-list/13934

2022年04月29日 0Comments 988Browse 0Like Read more
Computer Science

H2 数据库采用客户/服务器端连接数据的 JDBC 参数

我们可以使用下面的 H2 JDBC 参数来连接使用服务器方式运行的 H2 数据库。 jdbc:h2:tcp://localhost/~/test;USER=sa;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE 上面参数的意思是采用的是 tcp 的连接方式,连接的数据库名称为 test。 同时连接的服务器地址为 localhost,意思为本地服务器。 webPort 也可以通过网页方式访问启动的 H2 服务器。 端口地址为:8082 例如你可以访问:http://192.168.1.229:8082/login.jsp 来获得登录界面。 如果你没有修改登录密码的话。 直接单击连接就可以进行连接了。 连接后,你会看到下面的控制台界面。     这种模式就是使用服务器方式启动 H2 后的控制台信息。   https://www.ossez.com/t/h2-jdbc/13931

2022年04月28日 0Comments 725Browse 0Like Read more
Computer Science

H2 数据库如何以服务器方式启动

以服务器方式启动 H2 数据库非常简单。 你可以下载任何一个 H2 的 jar 包。 然后运行: java -jar h2-2.1.212.jar 在启动后,直接通过你的本地计算机浏览器访问地址: http://192.168.1.229:8082/login.do 就可以了。 你将会看到需要登录的界面。 单击链接就可以了。 Java 连接需要使用的 JDBC 参数,请参考: H2 数据库采用客户/服务器端连接数据的 JDBC 参数 页面中的内容。   https://www.ossez.com/t/h2/13932

2022年04月28日 0Comments 850Browse 0Like Read more
Computer Science

Windows Edge 浏览器的有关 URL 链接的复制粘贴

在 Windows 如果使用 Edge 进行复制粘贴的时候,我们可能会需要拷贝 URL。 但是粘贴的时候却和标题一同粘贴显示出来了。 例如我们现在正在编辑的这个内容,其实我们只拷贝了 URL,但是如果你使用了 Edge 浏览器进行编辑的话,却同时还显示了标题。     如果上面的图片显示的内容,其实我们并不需要显示标题。 如何修改 进入 Edge 浏览器的设置。     然后选择分享,拷贝和粘贴。 在这个界面中,你可以选择你需要的格式。 在默认情况下 Ctrl+V 将会使用链接模式。     你可以选择使用 纯文本模式来和以前的拷贝张贴方式保持一致。 当然,你还可以使用张贴为什么来对设置进行调整。     在 Edge 的文本编辑区域中,选择鼠标的右键来进行配置。   https://www.ossez.com/t/windows-edge-url/13933

2022年04月28日 0Comments 665Browse 0Like Read more
Computer Science

CentOS 8 更新提示 appstream 错误

在 CentOS 8 进行更新的时候提示错误: Error: Failed to download metadata for repo appstream”     完整的错误提示为: Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist 问题和解决 这是因为 CentOS 8 已经不再提供支持,并且在 2021 年已经结束生命周期了。 如果你还想使用 dnf 或者 yum 对 CentOS 8 进行更新的话,你只能使用 Fedora 的库了。 运行下面 2 个命令: dnf --disablerepo '*' --enablerepo=extras swap centos-linux-repos centos-stream-repos dnf distro-sync 对 CentOS 8 的源进行修改后,就可以继续使用 dnf 进行更新了。   https://www.ossez.com/t/centos-8-appstream/13928

2022年04月26日 0Comments 586Browse 0Like Read more
Computer Science

Windows 11 修改 PIN 的长度为 4 位

Windows 最近不知道抽了什么风,要求 PIN 的长度至少有 6 位。 太难了,我们就喜欢 4 位的。 其实这个是可以修改的。 WIN + R 运行 gpedit.msc 然后选择密码复杂度。     针对最小的密码复杂度,我们选择启用后,然后输入最小的密码长度 4 后保存退出。     在完成上面的设置后,你需要重启你的计算机。 然后再修改用户的 PIN 就可以设置为 4 位密码了。   https://www.ossez.com/t/windows-11-pin-4/13926

2022年04月25日 0Comments 803Browse 0Like Read more
1…112113114115116…304
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (522)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1