当前位置: 首页 > 面试题库 >

如何使用Java8通过谓词对列表进行分区?

邵宜年
2023-03-14
问题内容

我有一个清单a,我想分成几个小清单。

说出所有包含“ aaa”的项目,所有包含“ bbb”的项目以及更多谓词。

我该如何使用java8?

我看到了这篇文章,但只拆分为2个列表。

public void partition_list_java8() {

    Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s");

    Map<Boolean, List<String>> decisionsByS = playerDecisions.stream()
            .collect(Collectors.partitioningBy(startWithS));

    logger.info(decisionsByS);

    assertTrue(decisionsByS.get(Boolean.TRUE).size() == 3);
}

我看到了这篇文章,但是在Java 8之前已经很老了。


问题答案:

就@RealSkeptic中解释的那样,注释Predicate只能返回两个结果:true和false。这意味着您将只能将数据分为两组。
您需要的是某种Function可以让您确定应该分组在一起的元素的常见结果。在您的情况下,这样的结果可能是小写的第一个字符(假设所有字符串都不为空-至少有一个字符)。

现在,Collectors.groupingBy(function)您可以将所有元素分组到单独的列表中,并将它们存储在Map中,其中键是用于分组的常见结果(例如第一个字符)。

所以你的代码看起来像

Function<String, Character> firstChar =  s -> Character.toLowerCase(s.charAt(0));

List<String> a = Arrays.asList("foo", "Abc", "bar", "baz", "aBc");
Map<Character, List<String>> collect = a.stream()
        .collect(Collectors.groupingBy(firstChar));

System.out.println(collect);

输出:

{a=[Abc, aBc], b=[bar, baz], f=[foo]}


 类似资料:
  • 我试图创建一个从最终用户抽象谓词使用的类。 我的应用程序使用了番石榴重试扩展,效果很好。 我可以很容易地用谓词调用它,它会轮询,直到谓词返回false。 现在,也许我误解了谓词,但我正在尝试创建一个类来抽象它们。 我想这样称呼它 所以我写了如下PollCondition类。 但是MyPoller。poll()调用无法编译-未声明结果。 知道吗?

  • 问题内容: 我想做类似的事情: Python的标准库中是否有类似行为? 我知道在这里自己动手很容易,但是我正在寻找一种更标准的方法。 问题答案: 您可以使用filter方法: 或列表理解: 要查找单个元素,可以尝试: 尽管如果没有匹配项将引发异常,因此您可能希望将其包装在try / catch中。方括号()使之成为生成器表达式,而不是列表理解。 就我个人而言,尽管我只是使用常规的过滤器/理解并采用

  • 问题内容: 我有一个对象集合,我想将其划分为两个集合,其中一个通过谓词,而其中一个失败谓词。我希望有一个Guava方法可以做到这一点,但是最接近的是filter,它没有给我其他的集合。 我会想像一下方法的签名,就像这样: 我意识到这对自己进行编码非常快,但是我正在寻找一种可以满足我需要的现有库方法。 问题答案: 使用番石榴的。 这是一个示例,该示例将单词列表分为两部分:长度大于3的单词和不大于3的

  • 有两个具有相同结构的地图,即map1和map2,其结构为

  • 问题内容: 我的清单包含大小等的集合。我尝试这样做,但似乎不起作用。 我想要的最终结果是。 我可以尝试添加在所有的元素和那种出来再做出新的的。但是,有某种班轮吗? 更新: 这可行,但是可以简化吗? 问题答案: @Eugene的回答很甜蜜,因为番石榴很甜。但是,如果您碰巧在类路径中没有番石榴,这是另一种方式: 首先,我将所有集合映射到一个流中,然后对所有元素进行排序,最后,将整个排序后的流收集到集合