Java学习day08--方法引用和Stream流
Java学习day08--方法引用和Stream流
- 方法引用和Stream流
- 方法引用
- 获取Collection、Map、数组流
- Stream流的常用操作方法
方法引用和Stream流
1).流思想:类似于“迭代器”,对“集合元素”进行多次的筛选、过滤、统计用的。
2).流的工作方式:每个操作后,这个流对象就成为垃圾,等待被回收;但这个操作的方法通常会返回一个新流--每个“流对象”都是一次性的。类似于:流水线。
3).Stream流中大量运用lambda表达式,对于某些lambda表达式而言,可以利用方法引用替换lambda表达式,从而再次简化代码。
4).方法引用是指,当我们要编写一个Lambda表达式时,发现已经有一个现有的方法已经实现了我们在Lambda中要实现的功能,这时就可以引用这个已写好的方法,来代替我们的Lambda表达式。
方法引用
我们首先创建一个类,以下所有内容讲解都基于这个类
public class Student {private String name;private int age;// 构造方法引用public Student(String name, int age) {this.name = name;this.age = age;}// 构造方法引用public Student(String name){this.name = name;this.age = 20;}// 构造方法引用public Student() {this("热巴", 18);}// 利用这个实例化方法引用public String getName() {return name;}// 利用这个静态方法引用public static boolean func1(String s){return s.length() > 2;}
}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
- 实例方法引用
格式,对象名::函数名
Student stu = new Student("杨幂", 19);
// 实例化方法引用
func(stu::getName); // 这里利用实例化对象调用show方法,可以不用自己再写lambda表达式public static void func(Supplier<String> sp){String str = sp.get();System.out.println(str);}
- 静态方法引用
格式,类名::函数名
注意:该方法应用只能通过类名调用,实例化对象不可调用
// 静态方法引用
func1(Student::func1, "杨幂"); // 调用Student类中func1静态方法public static void func1(Predicate<String> sp, String str){boolean b = sp.test(str);System.out.println(b);}
- 引用对象的构造方法
不管是无参构造还是有参构造,格式写法相同,程序会自动判断选择哪个构造函数。写法为类名::new,如Student::new
// 引用构造方法--有参数
func2(Student::new, "刘亦菲"); // 这个会自动选择有一个参数的构造方法
// 引用构造方法--无参数
func3(Student::new); // // 这个会自动选择无参数的构造方法public static void func2(Function<String, Student> f, String str){Student student = f.apply(str);System.out.println(student);}public static void func3(Supplier<Student> sp){Student student = sp.get();System.out.println(student);
}
- 数组构造器引用
格式:类型名[]::new
// 数组构造器引用func4(int[]::new, 4); public static void func4(Function<Integer, int[]> f, Integer integer){int[] arr = f.apply(integer);for (int i = 0; i < arr.length; i++) {arr[i] = i * 2 + 1;}System.out.println(Arrays.toString(arr));}
获取Collection、Map、数组流
- Collection流的获取
通过Collection接口的默认方法stream(),具体调用格式为Collection对象.stream()即可获取。如:
ArrayList<String> list = new ArrayList<>();
list.stream(); // 返回结果即为流对象
- Map获取流
有三种获取流的方式
// 方式一:获取键的流
Map<String, Integer> map = new HashedMap<>();
map.keySet().stream();// 方式二:获取值的流
map.values().stream();// 方式三:获取键值对的流
map.entrySet.stream();
- 获取数组的流
这里又分为两种,一种是获取引用类型的流,另一种是获取基本类型的流。
// 第一种:获取基本类型的流
IntStream.of(arr); // arr为对应类型的数组,如此处为int类型的数组
LongStream.of(arr);
DoubleStream.of(arr);// 第二种:获取引用类型的流
Stream.of(arr) // arr为引用类型的数组
4.零散的数据获取流
Stream<Integer> s = Stream.of(1, 23, 4, 5, 7, 8, 9, 0, 8);
Stream流的常用操作方法
- 逐一处理forEach
void forEach(Consumer<? super T> action); // 方法原型
示例代码:
ArrayList<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");// 1. forEach逐一处理
list.stream().forEach(s -> System.out.println(s + "是好样的")); // 在每一个元素后面加“好样的”
程序结果为:
张无忌是好样的
周芷若是好样的
赵敏是好样的
张强是好样的
张三丰是好样的
- 过滤filter
Stream<T> filter(Predicate<? super T> predicate); // 方法原型
示例代码:
// 先 筛选姓“张”的,再在尾部加上“是好样的”
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s + "是好样的"));
结果为:
张无忌是好样的
张强是好样的
张三丰是好样的
- 计数count
long count(); // 方法原型
示例代码:
// 获取姓张的一共有几个
long num = list.stream().filter(s -> s.startsWith("张")).count();
System.out.println("张姓的一共有" + num + "个");
结果为:
张姓的一共有3个
- 取出前几个limit
Stream<T> limit(long maxSize); // 方法原型
示例代码:
// 获取张姓的前一个并打印
list.stream().filter(s -> s.startsWith("张")).limit(1).forEach(System.out::println);
结果为:
张无忌
- 跳过前几个skip
Stream<T> skip(long n); // 方法原型
示例代码:
获取张姓的除了一个并打印
list.stream().filter(s -> s.startsWith("张")).skip(1).forEach(System.out::println);
- 映射(转换)map
<R> Stream<R> map(Function<? super T, ? extends R> mapper); // 函数原型
示例代码:
ArrayList<String> list1 = new ArrayList<>();
list1.add("123");
list1.add("456");
list1.add("789");
list1.add("101");
// 将String先转为Int类型,再打印加5的值。以下两种写法均可,任选其一即可
list1.stream().map(s -> Integer.valueOf(s)).forEach(s -> System.out.println(s + 5));
list1.stream().map(Integer::parseInt).forEach(s -> System.out.println(s + 5));
- 合并concat
public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) // 函数原型,是一个静态方法
示例代码:
// 将list和list1的流合并
Stream.concat(list.stream(), list1.stream()).forEach(System.out::println);
- 将Stream流结果转换为各种集合之collect方法
Stream<String> stream = list.stream();
// 转为List类型
stream.collect(Collectors.toList());// 转为Set类型
stream.collect(Collectors.toSet());// 转为数组
stream.toArray(类型名[]::new);
注:
- 拼接方法,返回一个新流;
- 终结方法,返回的是最终的值。
前面讲的count和forEach方法为终结方法,其余的均是拼接方法(也除了collection方法)。
Java学习day08--方法引用和Stream流相关推荐
- Java中 方法引用、Stream流、及方法实例 D190401
Java中 方法引用.Stream流.及方法实例 D190401 01.第三章:方法引用_什么是方法引用 1).什么是"方法引用":指引用现有的方法代替Lambda表达式--当我们 ...
- JAVA进阶知识点总结 8【方法引用、Stream流】
01.第三章:方法引用_什么是方法引用 1).什么是"方法引用":指引用现有的方法代替Lambda表达式–当我们要写一个Lambda表达式做一些事情时,发现有些方法已经实现了我们要 ...
- Java学习笔记---Lambda表达式及Stream流Api
Lambda 特性: 允许把函数作为参数传递进方法. 前置条件: 必须是函数式接口---------->[函数式接口:满足以下三条1.接口中只有一个抽象方法.2.可以有默认实现的方法.3.可以有 ...
- Java8 方法引用和Stream流
Stream 流API 什么是流 流的操作种类 流的操作过程 使用流 创建流 集合 数组 值 筛选 filter 去重 distinct 截取 limit 跳过 skip 映射 map 合并多个流 是 ...
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- 你知道Java 8 的方法引用吗
1. 前言 Java中的方法引用,很多同学都见过但却叫不出名字甚至不太会用,在这篇文章中,我们将看到什么是方法引用以及如何使用它. 2. 方法引用的使用场景 我们先来看看方法引用的使用: new Ra ...
- Java从入门到精通十七(Stream 流)
Java从入门到精通十七(Stream 流 ) Stream 流引入说明 Stream 流的常用方法说明 1: filter() 2:collect() 3:distinct() 4:sorted() ...
- Java 学习 Day08
Java 学习 Day08 项目:<客户信息管理软件> 主要涉及以下知识点: 类结构的使用:属性.方法及构造器 对象的创建与使用 类的封装性 声明和使用数组 数组的插入.删除和替换 关键字 ...
- java学习心得---方法
java学习心得-方法 一.概念 方法是实现特定功能的一段代码,可以重复使用. 二.定义 一些列代码指令的合集(就是将一些代码整合再一起). 三.作用 提高代码的重复性. 四.定义的格式 访问修饰符+ ...
最新文章
- 收银系统服务器数据库,收银系统服务器数据库
- C++ 高级篇(一)—— 模板(Templates)
- python 对象引用、可变性 和 垃圾回收
- word公式编辑器_【Word技巧】word使用终极技巧,工程人必会(四)
- 我们一定要有自立的飞秋觉悟
- python学习方法总结_Python学习总结(一)
- 为什么判断list的时候,既要判断不等于null有要判断size大于0
- 3张经典人事管理模板,HR都直呼很好用
- wordpress配置HTTPS遇到问题解决方案
- CoAP 协议分析与测试
- c语言int doubt,c语言错误error: incompatible types in assignment
- SA8155P QCOM 车载系统介绍
- [原创]中国大陆民谣盘点8 曹崴《情歌唱晚》
- 阅读书籍:Monte Carlo Methods(第一章 Introduction to Monte CarloMethods)
- 使用STM32输出PWM波形
- TB5128 + Arduino UNO,更方便控制步进电机
- .NET(C#)连接各类数据库-集锦 1
- 从“小时购”看京东即时零售的新野望
- Mongrel2服务器配置及控制
- Linux nvme驱动分析之块设备层