我需要将包含多个for循环和if语句的代码转换为Java 8 Streams:
public static List<String> removeDuplicateNames(String[] namesArray){
List<String> uniqueNames = new ArrayList<>();
int occurrence = 0;
for(String name: namesArray) {
for (String name2 : namesArray)
if (name.equalsIgnoreCase(name2))
occurrence++;
if (occurrence == 1)
uniqueNames.add(name);
occurrence = 0;
}
return uniqueNames;
}
我需要遍历名称数组,并返回仅包含不重复名称的列表。如果一个名称出现多次,则需要从最终列表中删除。
输入-> [“汤姆”,“乔治”,“汤姆”,“麦克”,“布莱恩”]
Output-> [“ George”,“ Mike”,“ Brian”]
任何人都可以帮忙吗?
name
到频率计数的映射,然后得到计数为1的名称。实际上,您的非流代码也应该这样做,以获得更好的性能。
public static List<String> removeDuplicateNames(String... namesArray) {
return Stream.of(namesArray)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.filter(e -> e.getValue() == 1)
.map(Entry::getKey)
.collect(Collectors.toList());
}
Test
System.out.println(removeDuplicateNames("This", "is", "a", "test", "a", "real", "good", "test"));
输出
[This, is, real, good]
equalsIgnoreCase
分组相等的名称(通过将所有String
转换为小写),并仅保留大小为1的组。public static List<String> removeDuplicateNames(String[] namesArray){
return Arrays.stream(namesArray)
.collect(Collectors.groupingBy(String::toLowerCase))
.values()
.stream()
.filter(l -> l.size() == 1)
.map(l -> l.get(0))
.collect(Collectors.toList());
}
测试:
System.out.println(removeDuplicateNames(new String[] {"This", "is", "a", "test", "A", "better", "Test"}));
输出:
[better, This, is]
List<String> uniqueNames = Arrays.stream(namesArray)
.collect(Collectors.groupingBy(n -> n, Collectors.counting()))
.entrySet().stream()
.filter(e -> e.getValue() == 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
这里是输出。
[Brian, Mike, George]
List<String> unique = Arrays.stream(namesArray).distinct().collect(Collectors.toList());