对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

时间: 2024-08-30 15:36:59

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

【转】Java8 Stream 流详解

  当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是实际上,它们完全是不同的东西. Java8 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操作. 本文就将带着你如何使用 Java 8 不同类型的 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(删除)语句 ※ 数

Java8 Stream API

Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String contents = new String(Files.readAllBytes( Paths.get("alice.txt")), StandardCharsets.UTF_8); // 读取文件到字符串中 List<String> words = Arrays.asList(c

Mysql 备份恢复的简单实践

一.备份: 进行mysql的安装目录: 使用./mysqldump -u root -h 127.0.0.1 -P 3306 -p mysql>trymysql.sql 输入密码,备份成功. 二.恢复 进行mysql. 创建数据库 create database trymysql; 进入数据库 use trymysql ; 恢复 source trymysql.sql Mysql 备份恢复的简单实践

图解java8 stream 的几个转换方法

图片摘自:http://ifeve.com/stream/ 1.distinct 对于stream中包含的元素进行去重复操作(去重复依赖元素的equals方法) 2.filter 对于stream中包含的元素使用给定的过滤函数进行过滤操作 3.map 对于stream中包含的元素使用给定的转换函数进行转换操作.这个方法有三个变种方法:mapToInt.mapToLong.mapToDouble 4.flatmap 和map类似,不同的是其每个元素转换得到的是stream对象,会把子stream中

GDB 程序调试简单实践

用了好久的GCC/G++ 却一直都没用过GDB调试过程序,有时程序不是很大,一般有错,直接看编译器编译结果就差不多知道错在哪儿了,或者使用codeblocks单步调试,甚至回到windows下面调试,但是总是不太方便,因此有必要看一下GDB调试方法和基本步骤. 下面是一个简单的演示: 首先创建一个有错误的代码,如下: 这个程序很简单,目的是接受用户的输入,并将用户的输入回应输出来. 但是这个程序的第17行有个错误,使用了未初始化的字符指针name,因此编译运行后会出现段错误,如下: 下面利用GD

ZooKeeper分布式锁简单实践

ZooKeeper分布式锁的实现原理 在分布式解决方案中,Zookeeper是一个分布式协调工具.当多个JVM客户端,同时在ZooKeeper上创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁能够创建节点成功,谁就能够获取到锁.没有创建成功节点,就会进行等待,当释放锁的时候,采用事件通知给客户端重新获取锁资源.如果请求超时直接返回给客户端超时,重新请求即可. 代码实现为了更好的展现效果,我这里设置每个线程请求需要1s,请求超时时间为30s. 首先我们先写一个测试类,模拟多线程多客户端请

java8 stream流操作

Stream 在对流进行处理时,不同的流操作以级联的方式形成处理流水线.一个流水线由一个源(source),0 到多个中间操作(intermediate operation)和一个终结操作(terminal operation)完成. 源:源是流中元素的来源.Java 提供了很多内置的源,包括数组.集合.生成函数和 I/O 通道等. 中间操作:中间操作在一个流上进行操作,返回结果是一个新的流.这些操作是延迟执行的. 终结操作:终结操作遍历流来产生一个结果或是副作用.在一个流上执行终结操作之后,该