IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java8新特性 -> 正文阅读

[Java知识库]java8新特性

一、四大内置函数式接口

  • Consumer<T> 消费型接口: void accepet(T t) 有来无回

  • Function <T R> 函数式接口: R apply(T t)

  • Supplier <T> 供给型接口:

    • T get()

  • Predicate<T> 段言型接口

    • boolean test<T t>

public class Class001_Functional {
 ? ?public static void main(String[] args) {
 ? ? ? ?testComsumer(2000,m-> System.out.println("每天固定给女主播刷超级火箭"+m));
 ? ? ? ?testComsumer(500,m-> System.out.println("每天做脸消费"+m));
?
 ? ? ? ?System.out.println(strHandler("nihaoa ? ",s-> s.trim()));;
 ? ? ? ?System.out.println(strHandler("nihaoa ? ",s-> s.toUpperCase()));;
?
 ? ? ? ?System.out.println(testSupplier(5,()->(int)(Math.random()*(5-1+1)+1)));
 ? ? ? ?System.out.println(testSupplier(46,()->(int)(Math.random()*(20-10+1)+10)));
?
 ? ? ? ?System.out.println(testPredicate(List.of("abc","abcd","abcde"),s->s.length()>3));
 ?  }
?
 ? ?//对集合中的多个字符串进行某种规则的过滤,返回满足条件的字符串
 ? ?public static List<String> testPredicate(List<String> list, Predicate<String> pre){
 ? ? ? ?List<String> newList = new ArrayList<>(); //存放满足条件的字符串
 ? ? ? ?for(String str:list){
 ? ? ? ? ? ?if(pre.test(str)){
 ? ? ? ? ? ? ? ?newList.add(str);
 ? ? ? ? ?  }
 ? ? ?  }
 ? ? ? ?return newList;
 ?  }
?
 ? ?//生成指定个数的不同规则的整数
 ? ?public static List<Integer> testSupplier(int num, Supplier<Integer> sup){
 ? ? ? ?List<Integer> list = new ArrayList<>(); //存放生成的所有整数
 ? ? ? ?for(int i=1;i<=num;i++){
 ? ? ? ? ? ?list.add(sup.get());
 ? ? ?  }
 ? ? ? ?return list;
 ?  }
?
 ? ?//对字符串进行某种行为处理,返回结果
 ? ?public static String strHandler(String str, Function<String,String> fun){
 ? ? ? ?return fun.apply(str);
 ?  }
?
 ? ?//每天固定消费某些金额做某些行为
 ? ?public static void testComsumer(double money, Consumer<Double> com){
 ? ? ? ?com.accept(money);
 ?  }
}

二、方法引用

方法引用:: 简化lambda表达式 是lambda表达式的另外一种表现形式

使用前提: ? 当lambda表达式的lambda体中的实现已经存在另外一个方法实现了,只需要在lambda体中调用另一个方法--->可以通过方法引用的写法直接引用那个方法 ? lambda表达式重写的抽象方法的参数列表与返回值对应内部所引用方法的参数列表与返回值 ? lambda返回值与内部所调用方法的方法直接对应,lambda的参数列表的第一个参数作为内部调用成员方法的对象存在,lambda的第二到多个参数直接匹配内部所调用方法的参数列表存在

分类 ? 对象::成员方法 ? 要求: lambda表达式重写的抽象方法的参数列表与返回值对应内部所引用方法的参数列表与返回值 ? 类名::静态方法 ? lambda表达式重写的抽象方法的参数列表与返回值对应内部所引用方法的参数列表与返回值 ? 类名::成员方法 ? lambda返回值与内部所调用方法的方法直接对应,lambda的参数列表的第一个参数作为内部调用成员方法的对象存在,lambda的第二到多个参数直接匹配内部所调用方法的参数列表存在

public class Class002_Quite {
 ? ?public static void main(String[] args) {
 ? ? ? ?//对象::成员方法
 ? ? ? ?PrintStream ps = ?System.out;
 ? ? ? ?Consumer<Integer> com = i-> ps.println(i);
 ? ? ? ?//考虑是否可以通过方法引用简化 : 1)lambda体的实现是否是通过调用另外一个方法实现的--> √ println
 ? ? ? ?// 2)考虑Consumer中的抽象方法的参数列表与返回值是否对应内部引用println方法的参数列表与返回值--> √
 ? ? ? ?com = ps::println;
 ? ? ? ?com = System.out::println;
 ? ? ? ?//List.of(1,2,3,4,5).forEach(com);
 ? ? ? ?List.of(1,2,3,4,5).forEach(System.out::println);
?
 ? ? ? ?//类名::静态方法
 ? ? ? ?//求两个小数中的最大值
 ? ? ? ?BiFunction<Double,Double,Double> fun = (x,y)->Math.max(x,y);
 ? ? ? ?//分析是否可以通过方法引用简化: 1)lambda体的实现是否是通过调用另外一个方法实现的--> √ max
 ? ? ? ?// 2)apply方法的参数列表与返回值是否直接匹配内部所调用方法的参数列表与返回值 -> √
 ? ? ? ?fun = Math::max;
 ? ? ? ?System.out.println(fun.apply(2.1,1.8));;
?
 ? ? ? ?//类名::成员方法
 ? ? ? ?BiPredicate<String,String> pre = (x,y)->x.equals(y);
 ? ? ? ?//分析是否可以通过方法引用简化:  1)lambda体的实现是否是通过调用另外一个方法实现的-->√  equals
 ? ? ? ?// 2)lambda返回值与内部所调用方法的方法直接对应,lambda的参数列表的第一个参数作为内部调用成员方法的对象存在,lambda的第二到多个参数直接匹配内部所调用方法的参数列表存在 --> √  可以使用类名::成员方法名简化
 ? ? ? ?pre = String::equals;
 ? ? ? ?System.out.println(pre.test("nihao","nihao"));;
 ?  }
} 

三、Stream

Stream : 关注流式运算,不是传输与存储 io流关注数据的传输 集合与数组关注数据的存储

注意: ? 1.Stream是一次性的流,一旦使用过就不能重复使用 ? 2.Stream的操作不会影响数据源中的数据 ? 3.延迟执行|惰性加载: 当获取终止行为时候才会执行中间操作

使用步骤: ? 1.获取Stream流 ? 2.中间行为 : 一系列的流式操作 ? 3.终止行为

3.1 创建Stream

创建Stream的方式: 1.Collection Stream<E> stream() 2.Arrays stream() 3.Stream.of(值列表)

public class Class001_Stream {
 ? ?public static void main(String[] args) {
 ? ? ? ?//1..Collection  Stream<E> stream()
 ? ? ? ?List<Integer> list = List.of(1,2,3,4,5);
 ? ? ? ?Stream<Integer> stream = list.stream();
 ? ? ? ?stream.forEach(System.out::println);
?
 ? ? ? ?//2.Arrays  stream()
 ? ? ? ?String[] arr = {"abc","bbb","ccc"};
 ? ? ? ?Stream<String> stream1 = Arrays.stream(arr);
 ? ? ? ?stream1.forEach(System.out::println);
?
 ? ? ? ?//3.Stream.of(值列表)
 ? ? ? ?Stream<Integer> stream2 = Stream.of(3,2,1);
 ? ? ? ?stream2.forEach(System.out::println);
 ?  }
}

3.2 Stream的中间行为

流式中间操作 1.过滤 Stream<T> filter(Predicate<? super T> predicate); 2.去重 Stream<T> distinct() 3.截取 Stream<T> limit(long maxSize) 4.跳过 Stream<T> skip(long) 5.排序 sorted() | sorted(Comparator<? super T> comparator) 6.映射 map(Function) :接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素

注意:中间操作都会返回一个持有结果新的流

public class Class002_Stream {
 ? ?static List<Employee> list = Arrays.asList(
 ? ? ? ? ? ?new Employee("lisi",19,5000),
 ? ? ? ? ? ?new Employee("wangwu",18,4000),
 ? ? ? ? ? ?new Employee("tianqi",17,4000),
 ? ? ? ? ? ?new Employee("zhaoliu",20,3000),
 ? ? ? ? ? ?new Employee("zhangsan",20,6000),
 ? ? ? ? ? ?new Employee("zhangsan",20,6000)
 ?  );
 ? ?public static void main(String[] args) {
 ? ? ? ?//1.获取一个stream
 ? ? ? ?Stream<Employee> stream = list.stream();
 ? ? ? ?//2.中间操作 延迟执行
 ? ? ? ?/*stream = stream.filter(e->{
 ? ? ? ? ? ?System.out.println("--------------过滤-----------");
 ? ? ? ? ? ?return e.getAge()>=18;
 ? ? ? ?}).distinct()
 ? ? ? ?.limit(3)
 ? ? ? ?.skip(1)
 ? ? ? ?.filter(e->{
 ? ? ? ? ? ?System.out.println("-----------最终过滤------------"+e);
 ? ? ? ? ? ?return true;
 ? ? ? ?});*/
?
 ? ? ? ?//排序
 ? ? ? ?//stream = list.stream().sorted();
 ? ? ? ?// stream = list.stream().sorted((x,y)->Double.compare(y.getSalary(),x.getSalary()));
?
 ? ? ? ?//映射
 ? ? ? ?//Stream<Double> stream2 = list.stream().map(e->e.getSalary());
 ? ? ? ?Stream<Double> stream2 = list.stream().map(Employee::getSalary);
?
 ? ? ? ?//3.终止行为
 ? ? ? ?stream2.forEach(System.out::println);
 ?  }
}

3.3 Stream 流的终止行为

规约 map-reduce 先加工->后处理汇总结果

收集(collect) collect 主要依赖 java.util.stream.Collectors 类内置的静态方法。 Collectors.toList()

public class Class003_Stream {
 ? ?static List<Employee> list = Arrays.asList(
 ? ? ? ? ? ?new Employee("lisi",19,5000),
 ? ? ? ? ? ?new Employee("wangwu",18,4000),
 ? ? ? ? ? ?new Employee("tianqi",17,4000),
 ? ? ? ? ? ?new Employee("zhaoliu",20,3000),
 ? ? ? ? ? ?new Employee("zhangsan",20,6000),
 ? ? ? ? ? ?new Employee("zhangsan",20,6000)
 ?  );
 ? ?public static void main(String[] args) {
 ? ? ? ?//1.获取一个stream
 ? ? ? ?Stream<Employee> stream = list.stream();
 ? ? ? ?//2.中间操作,终止行为
 ? ? ? ?//anyMatch-检查是否至少匹配一个元素
 ? ? ? ?System.out.println( stream.allMatch(e->e.getAge()>=18));;
 ? ? ? ?//需求:按工资排序,获取第一个员工信息
 ? ? ? ?// findFirst-返回第一个元素
 ? ? ? ?//1)降序排序  2)找到第一个元素
 ? ? ? ?Optional<Employee> op1= ?list.stream().sorted((x, y)->Double.compare(y.getSalary(),x.getSalary()))
 ? ? ? ? ? ? ?  .findFirst();
 ? ? ? ?if(op1.isPresent()){
 ? ? ? ? ? ?System.out.println(op1.get());
 ? ? ?  }
 ? ? ? ?//并行流
 ? ? ? ?op1 = list.parallelStream().findAny();
 ? ? ? ?System.out.println(op1.get());
?
 ? ? ? ?//薪资>5000的员工个数
 ? ? ? ?// count-返回流中元素的总个数
 ? ? ? ?System.out.println(list.stream().filter(e->e.getSalary()>5000).count());
?
 ? ? ? ? max-返回流中最大值
 ? ? ? ? min-返回流中最小值
 ? ? ? ?System.out.println(list.stream().max((x,y)->Double.compare(x.getSalary(),y.getSalary())).get());
?
 ? ? ? ?//规约 map-reduce  先加工->后处理汇总结果
 ? ? ? ?System.out.println(list.stream().map(Employee::getSalary).reduce((x,y)->x+y).get());;
?
 ? ? ? ?System.out.println(Stream.of(1,2,3,4,5).reduce((x,y)->{
 ? ? ? ? ? ?System.out.println("========>x = "+ x + " , y ="+y );
 ? ? ? ? ? ?return x+y;
 ? ? ?  }).get());;
?
 ? ? ? ?System.out.println(Stream.of(1,2,3,4,5).reduce(100,(x,y)->{
 ? ? ? ? ? ?System.out.println("========>x = "+ x + " , y ="+y );
 ? ? ? ? ? ?return x+y;
 ? ? ?  }));
?
 ? ? ? ?// 收集(collect)
 ? ? ? ?//collect 主要依赖 java.util.stream.Collectors 类内置的静态方法。
 ? ? ? ?//Collectors.toList()
 ? ? ? ?List<String> names = list.stream().distinct().map(Employee::getName).collect(Collectors.toList());
 ? ? ? ?System.out.println(names);
?
 ? ? ? ?Set<String> names2 = list.stream().map(Employee::getName).collect(Collectors.toSet());
 ? ? ? ?System.out.println();
?
 ? ? ? ?Map<String,Double> map = list.stream().distinct().collect(Collectors.toMap(Employee::getName,Employee::getSalary));
 ? ? ? ?System.out.println(map);
 ?  }
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-11-25 07:59:26  更:2021-11-25 08:01:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:01:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码