mbr*_*brc 5 java java-8 java-stream
Stream<Map.Entry<String, Long>> duplicates = notificationServiceOrderItemDto.getService()
.getServiceCharacteristics()
.stream()
.collect(
Collectors.groupingBy(
ServiceCharacteristicDto::getName, Collectors.counting()
)
)
.entrySet()
.stream()
.filter(e -> e.getValue() > 1);
Optional<String> dupName = duplicates.map(Map.Entry::getKey).findFirst();
Run Code Online (Sandbox Code Playgroud)
工作完美。但我想找到重复的不仅有名字而且还有名字+值+键
这意味着如果名称 + 值 + 键相同,则这是重复的。
我正在寻找 Collectors.groupingBy()
http://www.technicalkeeda.com/java-8-tutorials/java-8-stream-grouping
但我找不到正确的解决方案
以下对我有用:
public class Groupingby
{
static class Obj{
String name;
String value;
String key;
Obj(String name, String val, String key)
{
this.name = name;
this.value = val;
this.key = key;
}
}
public static void main(String[] args)
{
List<Obj> objects = new ArrayList<>();
objects.add(new Obj("A", "K", "Key1"));
objects.add(new Obj("A", "K", "Key1"));
objects.add(new Obj("A", "X", "Key1"));
objects.add(new Obj("A", "Y", "Key2"));
Map<List<String>, Long> collected = objects.stream().collect(Collectors.groupingBy(x -> Arrays.asList(x.name, x.value, x.key), Collectors.counting()));
System.out.println(collected);
}
}
// Output
// {[A, K, Key1]=2, [A, Y, Key2]=1, [A, X, Key1]=1}
Run Code Online (Sandbox Code Playgroud)
请注意,我使用属性列表进行分组,而不是属性的字符串连接。这也适用于非字符串属性。
如果您正在执行字符串连接,您可能会遇到一些极端情况,例如属性 (A, BC, D) 和 (AB, C, D) 将产生相同的字符串。
代替
.collect(Collectors.groupingBy(ServiceCharacteristicDto::getName, Collectors.counting()))
Run Code Online (Sandbox Code Playgroud)
你可以写
.collect(Collectors.groupingBy(s->s.getName()+'-'+s.getValue()+'-'+s.getKey(), Collectors.counting()))
Run Code Online (Sandbox Code Playgroud)