Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java8按谓词划分列表?_Java_List_Java 8_Java Stream - Fatal编程技术网

如何使用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]}