jdk1.8新特性之stream流

在jdk1.5的时候,我们需要掌握枚举:反射、注解、泛型。现在java14都出来了

jdk1.8的新特性:函数式接口、链式编程、stream流、lambda表达式 都掌握的怎么样了?

本篇将着重说明 Stream 流的用法

面试题:

按条件筛选用户,请你只用一行代码完成!

  • 1、id 为偶数
  • 2、年龄大于24
  • 3、用户名大写
  • 4、用户名倒排序
  • 5、输出一个用户

代码(User 实体类省略):

package stream;

import com.coding.test.entity.User;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StreamDemo {
    public static void main(String[] args) {
        User user1 = new User(1,"jim",23,"北京");
        User user2 = new User(2,"tom",24,"武汉");
        User user3 = new User(3,"echo",25,"深圳");
        User user4 = new User(4,"jerry",26,"上海");
        User user5 = new User(5,"bob",27,"北京");
        //数据库、集合 : 存数据的
        // Stream:计算和处理数据交给 Stream
        List<User> users = Arrays.asList(user1, user2, user3, user4, user5);
        users.stream()
                .filter(u->{return u.getId()%2 == 0;})
                .filter(u->{return u.getAge() > 24;})
                .map(u->{return u.getName().toUpperCase();})
                .sorted((u1,u2)->{return u2.compareTo(u1);})
                .limit(1)
                .forEach(System.out::println);
    }
}

接下来我们深入看看stream流中都有些什么?

创建流:

//1.创建一个具体字符串流
Stream<String> stream1 = Stream.of("A", "B", "C", "D");
//2.创建一个Stream流Builder<Object>对象
Stream.Builder<Object> builder = Stream.builder();
//3.创建一个空的String 流
Stream<String> empty = Stream.empty();
//4.合并两个流
Stream<String> concat = Stream.concat(stream1, empty);
//5.用迭代器创建无限流
Stream<Integer> iterate = Stream.iterate(1, x -> x + 1);
//6.生成 无限流
Stream<Double> generate = Stream.generate(() -> Math.random());
//7.collection的串行流  和并行流
List<String> list = Arrays.asList("1","2","3","4");
Stream<String> stream2 = list.stream();
Stream<String> stream3 = list.parallelStream();
//8.Arrays.stream创建一个数组流
IntStream stream = Arrays.stream(new int[]{1, 2, 3, 4});
//9.通过文件生成字符串流
Stream<String> stream = Files.lines(Paths.get("text.txt"), Charset.defaultCharset());

流的使用:

看的流的使用 也就是看users.stream()能点出来哪些东西,因为太多,这里就举例说明常用的几种:

1.filter过滤:

// 筛选出>3的数据
List<Integer> list = Arrays.asList(1,2,3,4);
list.stream().filter((i)->{return i > 3;}).forEach(System.out::println);
// 输出4

2.limit限流

// 获取未来7天的日期(顺便看看iterate 和 generate的用法)
        Stream.iterate(LocalDate.now(), date -> date.plusDays(1)).limit(7).forEach(date-> {
            System.out.print(date+",");
        });
        // 输出 2020-03-12,2020-03-13,2020-03-14,2020-03-15,2020-03-16,2020-03-17,2020-03-18,
        AtomicInteger a = new AtomicInteger(0);
        // 截取前三个随机数 并打印
        // 写在这里的 时候就想换行输出下 加个计数器判断下
        // 至于为什么用AtomicInteger计数而不是int
        // 因为“ Variable used in lambda expression should be final or effectively final”
        // AtomicInteger 在另一篇博客【并发编程之美-JUC]中有提到过
        Stream.generate(()->Math.random()).limit(3).forEach(d->{
            a.getAndIncrement();
            if(a.get() > 1){
                System.out.print(d+",");
            }else{
                System.out.print("\n"+d+",");
            }
        });
        //输出0.8662508892898771,0.26661993344781665,0.2584450405261183,

3.skip 跳出

//skip(n)去掉前n个元素的流
List<String> list = Arrays.asList("1","2","3","4");
//若流中元素不足n个,则返回一个空,与limit(n)互补。
list.stream().skip(3).forEach(System.out::print);
//输出4

4.sorted排序

//倒序排列
List<String> list = Arrays.asList("1","3","5","2","4");
list.stream().sorted((o1, o2)->{return o2.compareTo(o1);}).forEach(System.out::print);
//输出54321

5.distinct筛选

//去除重复数据
List<String> list = Arrays.asList("1","2","3","1","2");
list.stream().distinct().forEach(System.out::print);
//输出123

6.映射

// 流式计算将实体中某两个属性对应组装成key value的格式返回
// 项目中一般读取数据字典 根据code 返回前台数据使用
Map<Integer, String> collect = users.stream()
.collect(Collectors.toMap(User::getId, User::getName));
System.out.println(collect.toString());
// 输出{1=jim, 2=tom, 3=echo, 4=jerry, 5=bob}

// 获取某个元素输出对应的List
List<Integer> ids = users.stream().map(user - >user .getId()).collect(Collectors.toList());

//将user按adress 分组
Map<String, List<User>> addressMap = users.stream()
.collect(Collectors.groupingBy(User::getAddress));
System.out.println(addressMap.toString());
//输出:{上海=[[email protected]], 武汉=[[email protected]],
//深圳=[[email protected]], 北京=[[email protected], [email protected]]}

小结:以上就是stream 流的常见用法 至于规约 查找 匹配都用的都很少,暂且不再深入 ,关于lambda表达式和函数式接口后面会写,还有一个很好玩的类Optional,后面也来写写看,奥利给!!!

原文地址:https://www.cnblogs.com/itiaotiao/p/12664908.html

时间: 2024-10-09 04:17:18

jdk1.8新特性之stream流的相关文章

JDK9新特性 Reactive Stream 响应式流

JDK9新特性 Reactive Stream 响应式流  本篇主要讲解 JDK9特性 Reactive Stream 响应式流,介绍 Reactive Stream是什么 背压是什么,以及JDK9中提供的关于Reactive Stream的接口和 2个使用案例包括如何使用Processor.  1.Reactive Stream 概念  Reactive Stream (响应式流/反应流) 是JDK9引入的一套标准,是一套基于发布/订阅模式的数据处理规范.响应式流从2013年开始,作为提供非阻

JDK1.8新特性——Collector接口和Collectors工具类

JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进和优化. 部分内容来自以下博客: https://www.jianshu.com/p/7eaa0969b424 流式处理 JDK1.8中新增的流式处理提供了一种高效且易于使用的处理数据的方式,它可以对集合执行非常复杂的查找.过滤和映射数据等操作,极大的简化了对于集合的使用.借助流式处理,可以像使用S

Java 8 新特性:Java 类库的新特性之 Stream类 ——诺诺&quot;涂鸦&quot;记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  Java 类库的新特性之 Stream类 (注:此文中涉及到的一部分图片为网络图片,若有问题,请联系我将其删除.) 一.Java8对IO/NIO 的改进 Java 8 对 IO/NIO 也做了一些改进,主要包括: 改进了java.nio.charset.Charset 的实现,使编码和解码的效率得以提升: 精简了jre/lib

jdk1.8新特性应用之Iterable

我们继续看lambda表达式的应用: public void urlExcuAspect(RpcController controller, Message request, RpcCallback done) { if (Util.isEmpty(request)) { return; } Descriptor descriptor = request.getDescriptorForType(); if (Util.isEmpty(descriptor)) { return; } Field

jdk1.5新特性和jdk1.7新特性

jdk1.5新特性 1.自动装箱和自动拆箱 自动装箱,把基本类型的值变成对象类型 Integer a = 2; 自动拆箱,把对象类型变成基本类型 int b = new Integer(2); 而不需要调用intValue int b = new Integer(2).intValue(); 包装类有 Integer Boolean Float Double Short Byte 2.枚举 java枚举具有简单和安全性. 3.泛型 泛型在编译的时候可以控制类型,比如说List<String>

黑马程序员——java高新---JDK1.5新特性和反射

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.JDK1.5新特性 ——>静态导入 import和import static之间的区别: 1.import是导入一个类或某个包中所有的类. 2.import static是导入一个类中的某个静态成员或所有的静态成员. 注意: 1.当导入的两个类中有同名成员时,需要在成员前加上相应的类名. 2.当类名重名时,需要指定具体的包名. 3.方法重名时,需要指定具体所属的对象或者类. 代码示例: 1

接口、接口优点、接口的属性和方法特性、接口与继承的区别、接口与抽象类的区别、匿名实现类、JDK1.8新特性、打印类名称

接口里的属性,必须是公共的/默认的&静态的&Final&初始化后的属性: 接口里所有方法都是抽象的. 接口和继承---先天有的用继承,后天学习的用接口: 接口特性-------- 1.接口不可以被实例化: 2.实现类必须实现接口中所有方法,否则实现类必须是抽象类 3.实现类可以实现多个接口,来弥补Java不能多继承: 4.接口中的变量都是静态常量:(静态的-可以通过类的名字点-直接调用:) ----------------------------------------------

jdk1.5新特性

package cn.itcast.jdk15; import java.util.ArrayList; /* jdk1.5新特性之-----自动装箱与自动拆箱. java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述java中八种基本数据类型数据 基本数据类型 包装类型 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Charact

黑马程序员------Java中jdk1.5新特性

Java培训.Android培训.iOS培训..Net培训.期待与您交流! JDK1.5新特性: 为什么会出现新特性: 新的技术出现是为了解决老的问题,Java语言为了提高开发者的开发效率,对之前的某些不利于提高效率的技术进行改进. 静态导入: 静态导入:可以导入某个类下的静态方法,静态导入后,可以不写类名而直接使用此类下的静态方法. 语法:import static 包名.类名.静态方法 代码示例: package com.itheima.day1; /** * 静态导入 * @author