我膚淺洞察到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