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 +'}';}
  1. 实例方法引用
    格式,对象名::函数名
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);}
  1. 静态方法引用
    格式,类名::函数名
    注意:该方法应用只能通过类名调用,实例化对象不可调用
// 静态方法引用
func1(Student::func1, "杨幂");     // 调用Student类中func1静态方法public static void func1(Predicate<String> sp, String str){boolean b = sp.test(str);System.out.println(b);}
  1. 引用对象的构造方法
    不管是无参构造还是有参构造,格式写法相同,程序会自动判断选择哪个构造函数。写法为类名::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);
}
  1. 数组构造器引用
    格式:类型名[]::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、数组流

  1. Collection流的获取
    通过Collection接口的默认方法stream(),具体调用格式为Collection对象.stream()即可获取。如:
ArrayList<String> list = new ArrayList<>();
list.stream();          // 返回结果即为流对象
  1. Map获取流
    有三种获取流的方式
// 方式一:获取键的流
Map<String, Integer> map = new HashedMap<>();
map.keySet().stream();// 方式二:获取值的流
map.values().stream();// 方式三:获取键值对的流
map.entrySet.stream();
  1. 获取数组的流
    这里又分为两种,一种是获取引用类型的流,另一种是获取基本类型的流。
// 第一种:获取基本类型的流
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流的常用操作方法

  1. 逐一处理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 + "是好样的"));  // 在每一个元素后面加“好样的”
程序结果为:
张无忌是好样的
周芷若是好样的
赵敏是好样的
张强是好样的
张三丰是好样的
  1. 过滤filter
Stream<T> filter(Predicate<? super T> predicate);   // 方法原型

示例代码:

// 先 筛选姓“张”的,再在尾部加上“是好样的”
list.stream().filter(s -> s.startsWith("张")).forEach(s -> System.out.println(s + "是好样的"));
结果为:
张无忌是好样的
张强是好样的
张三丰是好样的
  1. 计数count
long count();    // 方法原型

示例代码:

// 获取姓张的一共有几个
long num = list.stream().filter(s -> s.startsWith("张")).count();
System.out.println("张姓的一共有" + num + "个");
结果为:
张姓的一共有3个
  1. 取出前几个limit
Stream<T> limit(long maxSize);   // 方法原型

示例代码:

// 获取张姓的前一个并打印
list.stream().filter(s -> s.startsWith("张")).limit(1).forEach(System.out::println);
结果为:
张无忌
  1. 跳过前几个skip
Stream<T> skip(long n);   //  方法原型

示例代码:

获取张姓的除了一个并打印
list.stream().filter(s -> s.startsWith("张")).skip(1).forEach(System.out::println);
  1. 映射(转换)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));
  1. 合并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);
  1. 将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流相关推荐

  1. Java中 方法引用、Stream流、及方法实例 D190401

    Java中 方法引用.Stream流.及方法实例 D190401 01.第三章:方法引用_什么是方法引用 1).什么是"方法引用":指引用现有的方法代替Lambda表达式--当我们 ...

  2. JAVA进阶知识点总结 8【方法引用、Stream流】

    01.第三章:方法引用_什么是方法引用 1).什么是"方法引用":指引用现有的方法代替Lambda表达式–当我们要写一个Lambda表达式做一些事情时,发现有些方法已经实现了我们要 ...

  3. Java学习笔记---Lambda表达式及Stream流Api

    Lambda 特性: 允许把函数作为参数传递进方法. 前置条件: 必须是函数式接口---------->[函数式接口:满足以下三条1.接口中只有一个抽象方法.2.可以有默认实现的方法.3.可以有 ...

  4. Java8 方法引用和Stream流

    Stream 流API 什么是流 流的操作种类 流的操作过程 使用流 创建流 集合 数组 值 筛选 filter 去重 distinct 截取 limit 跳过 skip 映射 map 合并多个流 是 ...

  5. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  6. 你知道Java 8 的方法引用吗

    1. 前言 Java中的方法引用,很多同学都见过但却叫不出名字甚至不太会用,在这篇文章中,我们将看到什么是方法引用以及如何使用它. 2. 方法引用的使用场景 我们先来看看方法引用的使用: new Ra ...

  7. Java从入门到精通十七(Stream 流)

    Java从入门到精通十七(Stream 流 ) Stream 流引入说明 Stream 流的常用方法说明 1: filter() 2:collect() 3:distinct() 4:sorted() ...

  8. Java 学习 Day08

    Java 学习 Day08 项目:<客户信息管理软件> 主要涉及以下知识点: 类结构的使用:属性.方法及构造器 对象的创建与使用 类的封装性 声明和使用数组 数组的插入.删除和替换 关键字 ...

  9. java学习心得---方法

    java学习心得-方法 一.概念 方法是实现特定功能的一段代码,可以重复使用. 二.定义 一些列代码指令的合集(就是将一些代码整合再一起). 三.作用 提高代码的重复性. 四.定义的格式 访问修饰符+ ...

最新文章

  1. 收银系统服务器数据库,收银系统服务器数据库
  2. C++ 高级篇(一)—— 模板(Templates)
  3. python 对象引用、可变性 和 垃圾回收
  4. word公式编辑器_【Word技巧】word使用终极技巧,工程人必会(四)
  5. 我们一定要有自立的飞秋觉悟
  6. python学习方法总结_Python学习总结(一)
  7. 为什么判断list的时候,既要判断不等于null有要判断size大于0
  8. 3张经典人事管理模板,HR都直呼很好用
  9. wordpress配置HTTPS遇到问题解决方案
  10. CoAP 协议分析与测试
  11. c语言int doubt,c语言错误error: incompatible types in assignment
  12. SA8155P QCOM 车载系统介绍
  13. [原创]中国大陆民谣盘点8 曹崴《情歌唱晚》
  14. 阅读书籍:Monte Carlo Methods(第一章 Introduction to Monte CarloMethods)
  15. 使用STM32输出PWM波形
  16. TB5128 + Arduino UNO,更方便控制步进电机
  17. .NET(C#)连接各类数据库-集锦 1
  18. 从“小时购”看京东即时零售的新野望
  19. Mongrel2服务器配置及控制
  20. Linux nvme驱动分析之块设备层

热门文章

  1. MLflow机器学习工作流管理使用教程
  2. 深入浅出ELK日志收集系统搭建
  3. 一篇文章带你搞定 SpringBoot 配合 SpringSecurity 实现自动登录功能
  4. for循环的说课c语言,教学设计《程序的循环结构-For循环语句》
  5. 为什么图像预处理矩阵要除以255?
  6. 关于ArcGIS的入门建议
  7. 【Python学习】程序练习《购物车程序》
  8. Linux 服务器安装、配置和维护,一文看全~
  9. 【PDF转换图片】如何把pdf文件转换成图片?如何把批量pdf文件转换成图片?如何把多目录批量pdf文件转换成图片?如何pdf文件转换成图片不失真不损失清晰度?今天教方法
  10. 趣闻-如何下载知乎视频