作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试深入了解 Java 8 流,但时不时仍会卡住。我目前有一个问题,我知道它可以通过流来完成,但我似乎无法理解如何正确使用它们。
我有一个字符串列表 A 并尝试根据特定规则找到 A 的所有元素 a 与 A 的另一个元素 b 匹配,然后创建一个 Map<String, List<String>>
所有 a -> 所有匹配的 b。
详细说明:
你能给我一个有效的 Java 8 流示例吗?
编辑:我将如何以一种不必要的昂贵方式做到这一点:
Pairs(x,y) = forEach(a,b in A)
where (a != b && P(a, b))
generatePairXY(a, b)
Map(x -> List(y)) = group(Pairs(x,y)) by x
这种方法的问题是我首先需要构建一个巨大的对列表,考虑到我的几百万个单词的数据集,这可能会耗尽内存。
最佳答案
List<String> list = ...;
Map<String, List<String>> map =
list.stream()
.collect(Collectors.toMap(a -> a, a -> list.stream()
.filter(b -> P(a,b))
.collect(Collectors.toList()))
);
我们的想法是创建一个映射,其中包含原始列表中每个字符串的键,以及一个匹配该键的所有字符串的过滤列表。
编辑:
这是一个完整的工作示例,其中如果两个字符串不相等但长度相同,则谓词 P 返回 true :
package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test
{
public static boolean P (String a, String b)
{
return a.length() == b.length() && !a.equals(b);
}
public static void main (String[] args)
{
List<String> list = new ArrayList<String>();
list.add ("aaa");
list.add ("bbb");
list.add ("ccc");
list.add ("cccc");
list.add ("dddd");
list.add ("ddd");
Map<String, List<String>> map =
list.stream()
.collect(Collectors.toMap(a -> a, a -> list.stream()
.filter(b -> P(a,b))
.collect(Collectors.toList()))
);
for (String key : map.keySet ()) {
System.out.print (key + ": " );
for (String value : map.get(key)) {
System.out.print (value+ " ");
}
System.out.println("");
}
}
}
输出:
aaa: bbb ccc ddd
ccc: aaa bbb ddd
bbb: aaa ccc ddd
ddd: aaa bbb ccc
dddd: cccc
cccc: dddd
关于java - Stream、Map、Reduce……是怎么做到的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25105529/
我是一名优秀的程序员,十分优秀!