我正试图让我的头脑进入Java 8流,但仍然时不时地陷入困境。我目前有一个问题,我知道它可以用流完成,我似乎无法理解如何正确使用它们。
我有一个字符串A列表,并尝试通过某个规则查找A的所有元素a与A的另一个元素b匹配,然后使用所有a - &gt;创建一个Map<String, List<String>>
。所有匹配的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
这种方法的问题在于我首先需要构建一个庞大的对列表,其中 - 考虑到我的数百万字的数据集 - 会耗尽内存。
答案 0 :(得分:4)
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()))
);
我们的想法是创建一个映射,其中包含原始列表的每个String的键,以及一个值,该值是与该键匹配的所有字符串的筛选列表。
编辑:
这是一个完整的工作示例,如果两个字符串不相等但长度相同,则谓词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