相关疑难解决方法(0)

Java 8流 - 合并两个集合,使其在特定字段中保持唯一

我有两个狗列表 - dogsList1,dogsList2
我想创建一个具有唯一名称字段的所有狗的列表.
(意思是,如果我遇到第二只同名的狗,我不会将它添加到结果列表中)

这是我在java中可以做的最好的,但它收集了唯一的名称,而不是Dogs :(
Dog包含除名称之外的其他字段)

// collect all dogs names from first list
List<String> dogNames1 = dogsList1.stream()
     .map(x -> x.getName()).collect(Collectors.toList()); 

dogList2.stream()
     .filter(x->!dogNames1.contains(x.getName()))
     .forEach( x->
            dogsList1.add(x);
     );
Run Code Online (Sandbox Code Playgroud)

可以改进吗?还有其他更好的解决方案或优化方法

java java-8 java-stream

3
推荐指数
2
解决办法
5689
查看次数

Stream API 按名称区分,按值区分最大值

给出以下示例类:

class Foo{
    String name;
    int value;
    public Foo(String name, int value) {
        this.name = name;
        this.value = value;
    }
    // getters, setters, toString & equals
}
Run Code Online (Sandbox Code Playgroud)

和 foo 列表:

List<Foo> fooList = List.of(new Foo("A",1), new Foo("A",2),
                                new Foo("B",1),
                                new Foo("C",1),
                                new Foo("D",1), new Foo("D",2), new Foo("D",3)
                            );
Run Code Online (Sandbox Code Playgroud)

我想获得一份按名称区分的 foo 列表,如果有多个,Foos我想保留具有最高值的那个。

我发现这个java-8-distinct-by-property问题可以按名称获取不同列表的元素,它使用此方法来获取不同的元素:

public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

fooList.stream().filter(distinctByKey(Foo::getName)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

它可以获取不同的元素,但如果有两个或多个同名元素,则保留列表中的第一个元素,并且我无法添加条件来保留具有最高值的元素。

另一种选择是使用分组依据:

Map<String,List<Foo>> …
Run Code Online (Sandbox Code Playgroud)

java java-stream

2
推荐指数
1
解决办法
1887
查看次数

使用 lambda 删除列表中的元素

嗨,我想在 java 中使用 lambda 来删除列表中的重复元素。定义是否重复将通过自定义函数让我们假设我们有这些对象:

Object1(id:1 , name:"SEVERO" , grade:"A")
Object2(id:2 , name:"SEVERO" , grade:"B")
Object3(id:3 , name:"LUCY" , grade:"A")
Object4(id:4 , name:"LUCY" , grade:"A")
Object5(id:5 , name:"PAULA" , grade:"A")
Run Code Online (Sandbox Code Playgroud)


预期成绩:

Object2(id:2 , name:"SEVERO" , grade:"B")
Object3(id:3 , name:"LUCY" , grade:"A")
Object5(id:5 , name:"PAULA" , grade:"A")
Run Code Online (Sandbox Code Playgroud)

所以基本上如果有同名的对象,我只想保留其中一个。将保留的是等级最高的那个(等级顺序:A->B->C),如果等级有平局,任何物品都可以保留,没有偏好.

我如何使用 java lambda 做到这一点?

java lambda

1
推荐指数
1
解决办法
77
查看次数

根据Java 8中的多个属性从对象列表中删除重复项

我试图从基于两个属性的对象列表中删除重复项,这个问题类似于下面的链接,但是我试图使用Java 8功能基于两个属性找到唯一性。

示例:我有一个自定义对象,其中两个属性一起构成唯一的条目

说列出客户

customerName和DOB一起进行唯一输入。

使用两个属性的谓词来识别区别的任何解决方案。像下面的链接,他们对一个属性有解决方案。 Java 8按属性区分

类似的问题:

根据Java 8中的属性从对象列表中删除重复项

java java-8

0
推荐指数
1
解决办法
7538
查看次数

标签 统计

java ×4

java-8 ×2

java-stream ×2

lambda ×1