如何使用java8按谓词划分列表?
我有一个列表如何使用java8按谓词划分列表?,java,list,java-8,java-stream,Java,List,Java 8,Java Stream,我有一个列表a,我想把它分成几个小列表 用“aaa”表示包含的所有项,用“bbb”表示包含的所有项,以及其他一些谓词 我如何使用java8实现这一点 我看到了这个,但它只分为两个列表 public void partition_list_java8() { Predicate<String> startWithS = p -> p.toLowerCase().startsWith("s"); Map<Boolean, List<String>
a
,我想把它分成几个小列表
用“aaa”表示包含的所有项,用“bbb”表示包含的所有项,以及其他一些谓词
我如何使用java8实现这一点
我看到了这个,但它只分为两个列表
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);
}
public void partition\u list\u java8(){
谓词startWithS=p->p.toLowerCase().startsWith(“s”);
Map decisionsByS=playerDecisions.stream()
.collect(收集器.partitionby(startWithS));
logger.info(决策系统);
assertTrue(decisionsByS.get(Boolean.TRUE.size()=3);
}
我看到了这一点,但它非常古老,在Java8之前。您可以使用它将(分组)->(分组中的内容列表)的流转换为。如果您不关心分组本身,那么在该映射上调用values()
,以获取分区的集合。就像谓词中解释的那样,只能返回两个结果:true和false。这意味着您只能将数据分为两组。
您需要的是某种类型的函数
,它将允许您确定应分组在一起的元素的一些常见结果。在您的例子中,这样的结果可以是小写的第一个字符(假设所有字符串都不是空的-至少有一个字符)
现在,您可以在单独的列表中对所有元素进行分组,并将它们存储在映射中,其中键将是用于分组的公共结果(如第一个字符)
所以你的代码看起来像
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);
谓词是布尔型的。它只有“真”和“假”。我认为在您的情况下,最好使用函数
和收集器::groupingBy
。
{a=[Abc, aBc], b=[bar, baz], f=[foo]}