Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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
Java groupingBy和转换字符串_Java_Java Stream_Collectors - Fatal编程技术网

Java groupingBy和转换字符串

Java groupingBy和转换字符串,java,java-stream,collectors,Java,Java Stream,Collectors,我收到一个字符串列表,我正试图使用.groupingBy进行分区,这将给我一个映射,并转换将在映射列表中结束的字符串 使用Collectors.mapping,这是我想使用的,但是所有的示例都使用了方法引用,比如.mappingSomeClass::GetSomex。。。因为我是用弦来表演的,所以这是做不到的 我原以为可以使用lambda作为映射函数,但似乎无法正确使用语法,结果导致类型不匹配:无法转换。。。错误 这说明了我正在努力做的事情- 导入java.util.*; 导入java.util

我收到一个字符串列表,我正试图使用.groupingBy进行分区,这将给我一个映射,并转换将在映射列表中结束的字符串

使用Collectors.mapping,这是我想使用的,但是所有的示例都使用了方法引用,比如.mappingSomeClass::GetSomex。。。因为我是用弦来表演的,所以这是做不到的

我原以为可以使用lambda作为映射函数,但似乎无法正确使用语法,结果导致类型不匹配:无法转换。。。错误

这说明了我正在努力做的事情-

导入java.util.*; 导入java.util.stream.collector; 班长 { 公共静态无效字符串[]args { 列表输入=数组。asListD8、S1、S5、D2、D15、S9; 系统输出打印输入; 地图 输出=输入.stream 收集 Collectors.groupingBys->s.startsWithD?绝望:严重 //,Collectors.mappingn->Integer.valueOfn.replaceAll[DS],Collectors.toList ; 系统输出输出; } } 这将创建映射,按预期对输入数据进行分组,并生成输出 {绝望=[D8,D2,D15],严重=[S1,S5,S9]}

但是我想要什么,正如你可能从评论中猜到的 Collectors.mappingn->Integer.valueOfn.replaceAll[DS],Collectors.toList 是一个映射,包含通过删除前缀从字符串中提取的值

我的实际用例可能会将一个字符串转换为另一个字符串,或者从更复杂的字符串中提取整数,但这说明了我正在尝试做什么

当我分组时,如何使用lambda函数进行映射? 我还不清楚在Collectors.mapping中第二个参数toList的用法,我已经阅读了一些示例

我用这段代码创建了一个新的收集器。

Collectors.groupingBy的版本采用另一个收集器作为值,例如:

@Test
public void streamsTest() {
    List<String> inputs = Arrays.asList("D8", "S1", "S5", "D2", "D15", "S9");
    System.out.println(inputs);

    Map<String, List<Integer>> outputs = inputs.stream()
            .collect(
                    Collectors.groupingBy(
                            s -> s.startsWith("D") ? "desperate" : "serious",
                            Collectors.mapping(
                                    s -> Integer.valueOf(s.substring(1)),
                                    Collectors.toList())));

    System.out.println(outputs);
}
这类似于。不同之处在于,转换可以在分组之外发生,并且可以独立演化

溪流、地图、群 元素流 使用映射变换每个元素这可以委托给单独的函数 定义收集策略 基于集合策略的分组 根据需要收集元素 导入java.util.AbstractMap.SimpleEntry; 导入java.util.array; 导入java.util.List; 导入java.util.Map; 导入java.util.function.function; 导入java.util.stream.collector; 类TransformAndGroupBy{ 公共静态无效字符串[]args{ 列表输入=数组。asListD8、S1、S5、D2、D15、S9; 系统输出打印输入; 函数转换=s->s.startsWithD ?新的SimpleEntrySparate,Integer.parseInts.substring1 :新的SimpleEntryserious,Integer.parseInts.substring1; 映射输出=输入。流//转换为流 .maptransform//执行必要的转换 .collectCollectors.groupingBye->e.getKey,Collectors.mappinge->e.getValue,Collectors.toList;//根据转换进行分组和收集 系统输出输出; } }
没什么问题,只要加上额外的。我想这只是一个打字错误。映射收集器应该是groupingBy调用的第二个参数,而不是collect调用。@Sweeper-我不确定我会将其称为输入错误,因为我错误地理解了收集器关联。根据埃里克的回答,我明白了。“很明显,你对溪流和收集器的工作方式有一个错误的想法。”。无论是在收集器中还是在收集器之前的步骤中应用映射,都没有任何区别。当您在一个具有更多内核和更大控制台的系统上复制和运行它时,您可能会玩得更好。您将看到,在任何一种情况下,工作线程都将对特定元素执行相同的步骤,并且结果并行性是相同的。正如我在实际用例中提到的,我将对不同的字符串模式进行不同的转换。@StephenP,你完全正确。您可以定义为参数或外部函数。maptransform类型的输出应可用于收集以更改收集策略,而收集策略反过来也可以更改结果类型。主要优点是map/tranform是一个独立的操作,因此可以代替数据进行操作,同时可以基于从转换中获得的组密钥创建组洗牌。但是,如果函数是在组内定义的,那么要么所有数据都必须在单个节点中,要么需要多级洗牌和精简。基本上,您的转换是输入类型和输出类型中的函数。groupby将对该输出类型执行操作。对于一个简单的程序来说,这可能是多余的,但是在大型管道中,这个拱门可以帮助实现。当然,代码复制是不必要的。你可以
还可以使用函数transform=s->new SimpleEntrys.startsWithD?绝望:严重,整数.parseInts.substring1@Holger感谢您的优化。因为这是一个布尔分组,所以执行Map outputs=inputs.stream.Collectors.collecting和thencollectors.partitioningBys->s.startsWithD,Collectors.mappings->Integer.valueOfs.substring1,Collectors.toList,m->Map.ofdesprate,m.gettrue,serior,m.getfalse可能更有效;对于较大的列表。此外,由于Java 9,我们可以在不创建字符串的情况下解析子字符串,即Integer.parseInts,1,s.length,10。但对于问题的例子这样的简单案例,这并不重要。
[D8, S1, S5, D2, D15, S9]
{desperate=[8, 2, 15], serious=[1, 5, 9]}