有没有办法使用 Java Streams 来实现这一点?
List<String> list = new ArrayList<>();
list.add("x=aa,y=bb,y=cc");
list.add("y=dd,z=ee,w=ff");
list.add("w=gg,w=hh,w=ii");
Run Code Online (Sandbox Code Playgroud)
我想过滤上面的 ArrayList 以仅包含类型为“y”的字符串值。像下面这样
list=["bb","cc","dd"]
Run Code Online (Sandbox Code Playgroud)
我可以使用 String.split(",") 使用多行代码并将符合条件的子字符串插入到新的 ArrayList 中来实现此目的。但是有没有一种干净的方法可以使用 Java Streams 来实现这一点呢?
你问:
\n\n\n有没有一种干净的方法可以使用 Java Streams 来实现这一点?
\n
是的。事实上,您可以处理您的输入,过滤掉不需要的部分,并生成一个完成的列表,所有这些都使用流。
\n首先定义一些示例数据,即输入列表。
\n从该列表生成一个流。根据我们的示例数据,该流有 3 个元素。
\n调用Stream#flatMap以返回一个新流,其元素由原始流\xe2\x80\x99s 元素的片段组成。新流有 9 个元素,是通过将 3 个原始元素中的每一个分解为 3 个部分而生成的 (3 * 3 = 9)。
过滤较新的较长流,以查找文本以我们的目标y=前缀开头的元素。
转换通过我们的 filter\xe2\x80\x99s谓词测试的每个字符串元素。使用简单的字符串操作将“y=”替换为空字符串。因此,诸如 之类的值就y=bb变成了bb。
通过聚集成一个新List对象来收集转换后的字符串。
List < String > inputs =\n List.of(\n "x=aa,y=bb,y=cc" ,\n "y=dd,z=ee,w=ff" ,\n "w=gg,w=hh,w=ii"\n );\nList < String > results =\n inputs\n .stream() // Generate stream whose elements are each of the list\xe2\x80\x99s elements.\n .flatMap( input -> Arrays.stream( input.split( "," ) ) ) // Break each element into parts, feeding each part into a new longer stream.\n .filter( pairing -> pairing.startsWith( "y=" ) ) // Filter out any strings not beginning with `y=`. \n .map( pairing -> pairing.replace( "y=" , "" ) ) // A value such as `y=bb` becomes `bb`.\n .toList(); // Collect transformed strings into a new list.\nRun Code Online (Sandbox Code Playgroud)\n运行时。
\n\n\n结果.toString() = [bb, cc, dd]
\n
.sorted()要将结果按排序顺序排列,请在 之前添加对 的调用toList()。
| 归档时间: |
|
| 查看次数: |
1079 次 |
| 最近记录: |