当前位置: 首页 > 知识库问答 >
问题:

寻找优雅的方法来解决Stream.all匹配等于true处理潜在的空流

沈乐邦
2023-03-14

我想使用以allMatch终端操作结束的单个流链获得一个假值。

然而,我发现由于allMatch操作的设计,它在处理空流时将返回true。

例如,以下代码返回true,因为过滤后的流在管道中是空的。

List<String> list = Arrays.asList("abc", "efg", "hij");
boolean isAllStartsWith1 = list.stream().filter(s-> s.endsWith("x")).allMatch(s->s.startsWith("1"));
System.out.println(isAllStartsWith1);

为了得到预期的结果(false),我需要将流收集到一个临时列表中,并添加额外的检查,以确认它是否为空,然后再传递给allMatch操作进行最终处理。这使得整个过程看起来非常笨拙,有没有更优雅的解决方案?

List<String> list = Arrays.asList("abc", "efg", "hij");
List<String> filteredList = list.stream().filter(s-> s.endsWith("x")).collect(Collectors.toList());
boolean isAllStartsWith1 = CollectionUtils.isEmpty(filteredList) ? false : filteredList.stream().allMatch(s->s.startsWith("1"));
                        
System.out.println(isAllStartsWith1);

共有2个答案

任宾鸿
2023-03-14

你可以用数数。count()如果结果大于0,则返回true,否则返回false。

System.out.println(list.stream().filter(s -> s.endsWith("x")).count() > 0 ? true: false); 
冯文彬
2023-03-14

更改原始实现:)

您想知道列表中是否有任何项目不是以1开头的,对吗?

(但我同意这种双重否定有点难以理解)

atLeastOneThatDoesNotStartWithOne = list.stream()
            .filter(s -> s.endsWith("x"))
            .anyMatch(s -> !s.startsWith("1"));

allStartWith1 = ! list.stream()
            .filter(s -> s.endsWith("x"))
            .anyMatch(s -> !s.startsWith("1"));
    

这种实现可能更快(取决于数据集),因为它可以在遇到一个失败的情况后停止,而不必检查所有项目)

 类似资料:
  • 本文向大家介绍Nodejs异步回调的优雅处理方法,包括了Nodejs异步回调的优雅处理方法的使用技巧和注意事项,需要的朋友参考一下 前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用。在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的

  • 问题内容: 编写自定义类时,通过和运算符允许等效性通常很重要。在Python中,这可以通过分别实现和特殊方法来实现。我发现执行此操作的最简单方法是以下方法: 你知道这样做更优雅的方法吗?你知道使用上述 比较方法有什么特别的缺点吗? 注意:需要澄清的一点-当和未定义时,你会发现以下行为: 也就是说,评估为False因为它确实运行了,所以对身份进行了测试(即“ a与b?是同一对象”)。 当和定义,你会

  • 本文向大家介绍MySQL root密码忘记后更优雅的解决方法,包括了MySQL root密码忘记后更优雅的解决方法的使用技巧和注意事项,需要的朋友参考一下 前言 一直以来,对于MySQL root密码的忘记,以为只有一种解法-skip-grant-tables。 问了下群里的大咖,第一反应也是skip-grant-tables。通过搜索引擎简单搜索了下,无论是百度,抑或Google,只要是用中文搜

  • 我目前正在开发JavaFX中的计算器,现在正在尝试实现键盘输入支持。 为此,我试图在主. java文件中实现一个EventHandler,如下所示: FXMLDocumentController。java: 现在的问题是,每当按下这些键时,都会发生与我在GUI中单击相应按钮时相同的事情。 所有数字按钮共享一个onAction事件, ,-,/,* 也共享一个,等等。它们都使用FXMLDocument

  • 我理解 在Scala中应该避免使用null Map.get将返回一个Option[B],我可以使用. getOrElse获取值并回退到默认值 例如。 同时,我正在与一个Java库交互,其中一些值为null。 e、 g.地图(“键1”- 在这种情况下,getOrElse将抛出空指针。 我想处理这两个案件,并导致写这样的东西 这很难看。(这是Map[任何],我需要该键的字符串) 是否可以使用隐式或任何

  • 问题内容: 我有一类关于物体的东西……拉特说苹果。 每个苹果对象都必须具有唯一的标识符(id)…如何(高效且有效率地)确保新创建的对象具有唯一的ID。 谢谢 问题答案: 在Apple类中有一个,并在构造函数中增加它。 确保您的递增代码是原子的可能是谨慎的做法,因此您可以执行以下操作(使用AtomicInteger)。这将确保如果两个对象完全同时创建,则它们不会共享相同的ID。