Kar*_*ter 2 java collections java-stream
我对Java 8 Collection流功能有一点肤浅的了解,所以我不确定以下是否可能:我想filter基于整数比较的集合并重用该值进行映射.
具体地说,如果Levenshtein距离小于一个值,我有一个Collection<String> strings并希望将每个值映射到Levenshtein到固定String x的距离levenshteinLimit.
String x = "some string";
Collection<String> strings = new LinkedList<>(Arrays.asList("not some string",
"some other string"));
int levenshteinLimit = 10;
Map<Integer, String> stringsLevenshteinMap = strings.stream()
.filter(string -> LevenshteinDistance.getDefaultInstance().apply(x, string) < levenshteinLimit)
.collect(Collectors.toMap(string -> LevenshteinDistance.getDefaultInstance().apply(x, string), Function.identity()));
System.out.println(stringsLevenshteinMap);
Run Code Online (Sandbox Code Playgroud)
效果很好并且表达了我正在寻找的结果,但需要冗余的距离计算.到目前为止,这不是问题.没有流的解决方案也是可能的.我正在努力学习新的东西.
我假设首先过滤然后映射更有效,因为对象的数量可能更小,这意味着更少的工作.
上面的代码使用Apache commons-text 1.1.可以在https://github.com/krichter722/java-filter-and-map-without-redundancy找到示例项目.
使用Tuple中间对象的东西应该有效:
Map<Integer, String> stringsLevenshteinMap = strings.stream()
.map(s -> new Tuple<>(LD.getInstance().apply(x, s), s)
.filter(t -> t.getFirst() < maxDistance)
.collect(Collectors.toMap(Tuple::getFirst, Tuple::getSecond));
Run Code Online (Sandbox Code Playgroud)