对Java8 stream的简单实践

最近学习很多Java8方面的新特性,特地做了一些简单的实践和总结。

import java.util.*;
import java.util.stream.Collectors;

public class StreamTest {
    static class User{
        private String name;
        private int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public String toString() {
            return name;
        }
// 重写hashCode
        @Override
        public int hashCode() {
            int n = 31;
            n = n * 31 + age;
            n = n* 31 + name.hashCode();
            return n;

        }

        @Override
        public boolean equals(Object obj) {
            if (!(obj instanceof User)) {
                return false;
            }
            User user1 = (User) obj;
            return this.name.equals(user1.name)
                    && Integer.valueOf(age).equals(user1.age);
        }
    }
    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        User user1 = new User("zdx", 12);
        User user2 = new User("zdx1", 12);
        User user3 = new User("zdx2", 18);
        User user4 = new User("zdx3", 22);
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);

        // 将 Stream 转化为List 并且实现去重
        List list1 = list.stream().distinct().collect(Collectors.toList());
        list1.forEach(System.out::println);

        // 将 Stream 转化为 Map
        // 实现此方法需要注意添加进Map的的 key 值不可以重复,否则会抛出异常!!!!
        Map<String, Integer> map = list.stream().collect(Collectors.toMap(User::getName, User::getAge));
        for (String key: map.keySet()) {
            System.out.println(key);
        }

//         去重实现方法一
        List<User> result = new LinkedList<>();
        for (User user : list) {
            boolean b = result.stream().anyMatch(u -> u.name.equals(user.name));
            if (!b) {
                result.add(user);
            }
        }

        result.forEach(System.out::println);

//         利用HashSet实现list的去重
        Set<User> set = new HashSet<>(list);
        set.forEach(System.out::println);
    }
}

原文地址:https://www.cnblogs.com/cangqinglang/p/10085374.html

时间: 12-07

对Java8 stream的简单实践的相关文章

Android 设计随便说说之简单实践(合理组合)

上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示applist,和下载app.第二是运行环境,在Android平台,有androidsdk提供socket等API支持.因此将模块大体换发了5个模块.(当然了图片加载可以额外提出,用开源组件去做,但是这里为了说明如何设计,暂不提到.还有下载也可以利用开源组件)分别是如下: 模块1 UI模块,负责展示信息和用

SQL知识以及SQL语句简单实践

综述 大家都知道SQL是结构化查询语言,是关系数据库的标准语言,是一个综合的,功能极强的同时又简洁易学的,它集级数据查询(Data Quest),数据操纵(Data Manipulation),数据定义(Data Definition),数据控制(Data Control)于一体 即: SQL语言包含4个部分: ※ 数据定义语言(DDL),例如:CREATE.DROP.ALTER等语句 ※ 数据操作语言(DML),例如:INSERT(插入).UPDATE(修改).DELETE(删除)语句 ※ 数

php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这样的.所以基本的显得额外重要,即是算法和数据结构,再就是好的设计模式了,,,听过一句话,是好的数据结构是让计算机更快的工作,而一个好的设计模式则是使开发者工作的更快! 单例模式 单例模式特点 $_instance 必须声明为静态的私有变量 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去

Java8 Stream初体验

如果你能说对下面这个语句的正确输出,那么恭喜你,这篇文章就不用看了~ List<Integer> nums = Arrays.asList(1,1,null,2,3,4,null,5,6,7,8,9,10); System.out.println("sum is:"+nums.stream().filter(num -> num != null).distinct(). mapToInt(num -> num * 2).peek(System.out::prin

也说Autofac在MVC的简单实践:破解在Controller构造函数中的实例化 - winhu

相信大家对Autofac并不陌生,很多人都在使用.本文只是介绍一下本人在使用时的一点想法总结. 在使用一个框架时,肯定要去它的官网查阅一下.autofac的官网给出了一些经典的使用案例.如注册容器: var builder = new ContainerBuilder(); // Register individual components builder.RegisterInstance(new TaskRepository) .As<ITaskRepository>(); builder.

webservice简单实践

第一步.在网站中右键添加新项,选择web服务: 第二步.在App_Code下面生成的WebService.cs文件中写上发布的webservice的地址和调用的方法,按业务逻辑书写这以Add()方法为例: 第三.本地测试看看调用效果是否成功,分别输入y和z的值30和33返回结果: This XML file does not appear to have any style information associated with it. The document tree is shown be

MySQL游标的简单实践

Q:为什么要使用游标? A: 在存储过程(或函数)中,如果某条select语句返回的结果集中只有1行,可以使用select into语句(上几篇博客有介绍到用法)来得到该行进行处理:如果结果集中有多行,简单的select语句成批地进行处理,需要在检索出来的行中前进或后退一行或多行--若是想得到其中的每一行进行处理,就必须使用游标. Q:什么是游标? A: 游标(cursor),是一个存储在MySQL服务器上的数据库查询,游标不是一条 SELECT语句,而是被该语句检索出来的结果集:可以看做是指向

jstl 简单实践

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    这里要和 <%     String path = request.getContextPath();   

JAXB最佳实践

JAXB主要用来实现对象和XML之间的序列化和反序列化. 本文主要总结JAXB基本使用方法和注意事项! 通过下文的XML示例内容进行JAXB的简单实践 <?xml version="1.0" encoding="UTF-8"?> <Provinces> <Province id="B001"> <name>北京</name> <code>30000</code>

java实现二维码生成的几个方法

1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourceforge.net/projects/barcode