我肤浅洞察到Java 8集流媒体功能,所以我不知道,如果以下甚至有可能:我想filter
基于整数比较的收集和再利用的映射该值。如何在没有冗余计算的情况下过滤和映射Java 8流中的值?
具体我有一个Collection<String> strings
并希望其每个值的Levenshtein距离如果Levenshtein距离小于值levenshteinLimit
映射到固定String x
。
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);
效果很好,并表达我正在寻找的结果,但需要冗余计算距离。到目前为止这不是问题。没有流的解决方案也是可行的。我试图学习新的东西。
我假定它是更有效的过滤,然后再映射,因为对象的数量是可能更小,这意味着较少的工作。上述
该代码使用Apache公地文本1.1。示例项目可在https://github.com/krichter722/java-filter-and-map-without-redundancy找到。
'val - > val = Function.identity()'以及 – Andrew
我打算回答这样的问题,但是在第一个映射中丢失了字符串。 – daniu
@daniu就我所了解的代码而言,该字符串除了'apply'的重复调用之外没有别的用途,所以这里没有真正的损失。 – Lothar