JDK8 Stream之如何给List属性去重?

217 阅读1分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

写在前面

上篇文章我们开始讲解了JDK中的Stream流的两个方法的区别,今天我们接着来看JDK8-Stream中的一些使用方案。

问题

今日问题是:Stream流如何针对List某个对象属性进行去重操作,并且输出单一属性的集合对象。

如何解决

问题已经抛出来了,那么如何解决呢?

让我们分成几步来逐一解决一下。

先解决输出单一属性的集合对象问题,这个更简单一些,用普通的方式我们是应该怎么写呢?

来看如下代码示例:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Test {

    private String name;
    private String pwd;

    public static void main(String[] args) {
        List<Test> list = new ArrayList<>();
        List<String> resultList = new ArrayList<>();
        list.add(new Test("张三", "123456"));
        list.add(new Test("张三1", "123456"));
        list.add(new Test("张三2", "123456"));
        list.add(new Test("张三2", "123456"));
        list.add(new Test("张三3", "123456"));
        list.add(new Test("张三4", "123456"));
        list.add(new Test("张三4", "123456"));
        for (Test test : list){
            resultList.add(test.getName());
        }
        System.out.println(resultList.toString());
    }

}

以上方式是普通写法,利用循环来获取属性并放入新的集合中。

如果使用Stream流的话,那就不一样了,我们可以通过一行代码就能获取到相应的结果了。

来看一下示例吧:

List<String> resultList = list.stream().map(Test::getName).collect(Collectors.toList());

一行代码搞定,接下来我们再来看一下如何去重其中的重复属性吧。

现在我们已经获得了resultList集合,其中有着所有的Name属性值,但是其中存在一些重复值,这时候我们使用Stream中的哪个方法呢?

很简单,Stream流提供了一个distinct方法,用于将集合去重操作。

代码如下:

List<String> resultList = list.stream().map(Test::getName).distinct().collect(Collectors.toList());

我们在map方法后加入了一个distinct方法,这样就可以做到去重操作了。

来看一下运行结果:

image.png

总结

今天的问题就是这些了,你还有其他的去重方案吗?