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

01.第三章:方法引用_什么是方法引用

1).什么是“方法引用”:指引用现有的方法代替Lambda表达式--当我们要写一个Lambda表达式做一些事情时,发现有些方法已经实现了我们要做的事,这时就可以使用“已实现的方法”来代替我们要写的“Lambda表达式”,这种形式叫:方法引用。

02.第三章:方法引用_示例_对象名—引用成员方法

03.第三章:方法引用_示例_类名—引用静态方法

04.第三章:方法引用_替代原则

1).正常情况:引用方法的形参、返回值类型必须同接口中抽象方法的形参、数据类型一致;
2).如果抽方法返回值,引用的方法必须也要有返回值;如果抽象方法没有返回值,引用的方法可以有,也可以没有返回值;
3).被引用的方法的形参类型,要大于,等于抽象方法的形参类型;被引用方法的返回值类型,要小于,等于抽象方法的返回值类型;

05.第三章:方法引用_示例_类—构造引用

1).无参:

2).有参构造:

06.第三章:方法引用_示例_数组—构造器引用

07.第三章:类名引用静态方法_练习:
1).定义一个接口:

public interface Animal {public void show(String s);
}

2).测试类:

public class Demo {public static void main(String[] args) {//1.使用匿名内部类fun(new Animal() {@Overridepublic void show(String s) {System.out.println("我是:" + s);}},"小猫...");//2.使用Lambdafun(s -> System.out.println("我是:" + s),"小狗...");//3.使用方法:System.out属性PrintStream的println(String s);fun(System.out::println, "小猪...");}public static void fun(Animal a,String s){a.show(s);}
}

08.第四章:Stream流_Stream流进行集合过滤的效果演示

1).什么是“Stream流”:它在Java中是一个接口,它类似于“迭代器”,但比迭代器更强大,
它也是对集合元素操作,但提供了比迭代器更丰富的功能:筛选、过滤、统计…。
2).Stream效果演示:

public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//1.找出所有"张"姓学员--存到一个新集合中List<String> list1 = new ArrayList<>();for(String s : list){if(s.startsWith("张")){list1.add(s);}}//2.再筛选出名字是三个字的张姓学员--存到一个新集合中List<String> list2 = new ArrayList<>();for(String s : list1){if(s.length() == 3){list2.add(s);}}//3.打印最终结果for (String s : list2) {System.out.println(s);}//*******************使用Stream流***********************list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));}
}

09.第四章:Stream流_流思想概述
1).“流”它就是一个增强的“迭代器”,可以对集合元素进行筛选、过滤、汇总…等操作。

10.第四章:Stream流_获取List_Set_Map_数组流
1).通过List和Set集合获取流:
List list = new ArrayList<>();

Stream sm = list.stream();

 Set<String> set = new HashSet<>();...Stream<String> sm = set.stream();

2).通过Map集合获取流:
Map不能直接获取流:
Map<Integer,String> map = new HashMap<>();

–|获取所有键的流:
Stream keyStream = map.keySet().stream();
–|.获取所有值的流:
Stream valueStream = map.values().stream();
–|获取所有键值对的流:
Stream<Map.Entry<Integer,String>> entryStream = map.entrySet().stream();
3).通过数组获取流:
–|引用类型数组:
Integer[] arr = {1,2,3,4,5};
Stream intStream = Stream.of(arr);
–|.基本类型数组:
int[] arr = {1,2,3,4,5};
IntStream stream = IntStream.of(arr);
4).通过一些零散的数据获取流:
Stream stream = Stream.of(1,2,3,4,5);

11.第四章:Stream流_常用方法_逐一处理forEach
1).方法原型:

     class Stream的子类{
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");void forEach(Consumer<T> action){//1.遍历所有元素for(String s : 所有元素){action.accept(s);}}}

2).示例代码:

public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");List<String> list2 = new ArrayList<>();//遍历所有元素/*list.stream().forEach(new Consumer<String>() {@Overridepublic void accept(String s) {list2.add(s);}});*///使用Lambdalist.stream().forEach(s -> list2.add(s));System.out.println(list2);}
}

12.第四章:Stream流_常用方法_过滤filter

1).方法原型:

 class Stream的子类{//伪代码Stream<T> filter(Predicate<T> predicate){//1.定义一个新流Stream<T> newStream = new Stream的子类();//2.遍历所有元素for(String s : 所有元素){boolean b = predicate.test(s);if(b){//将当前元素放到新流中newStream.add(s);}}//3.返回新流return newStream;}}

2).示例代码:

public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//筛选出所有的张姓学员/*list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张");}}).forEach(s-> System.out.println(s));*///使用Lambdalist.stream().filter(s->s.startsWith("张")).forEach(System.out::println);}
}

13.第四章:Stream流_常用方法_统计个数count
1).原型:
long count():
2).示例代码:

public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");long c = list.stream().filter(s -> s.startsWith("张")).count();System.out.println("张姓学员的数量:" + c);}
}

14.第二章:Stream流_常用方法_取用前几个limit
1).方法原型:
Stream limit(long maxSize);
2).示例代码:

public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//1.打印集合元素前三个:注意:不能是负数list.stream().limit(30).forEach(System.out::println);}
}

15.第二章:Stream流_常用方法_跳过前几个skip
1).方法原型:
Stream skip(long n);
2).示例代码:

public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//跳过前2个,注意:不能是负数list.stream().skip(2).forEach(System.out::println);}
}

16.第二章:Stream流_常用方法_映射(转换)map
1).原型:
Stream map(Function<T, R> mapper);
将一种泛型的Stream转换为另一种泛型
2).示例代码:

public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("88");list.add("76");list.add("55");list.add("44");//将集合中每个分数 + 5 显示//1.使用匿名内部类Stream<Integer> intStream = list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.valueOf(s);}});intStream.forEach(n -> System.out.println(n + 5));System.out.println("---------------------------------------");//2.使用Lambda表达式list.stream().map(s -> Integer.valueOf(s)).forEach(n -> System.out.println(n + 5));}
}

17.第二章:Stream流_常用方法_合并concat

1).方法原型:将两个Stream合成一个Stream
public static Stream concat(Stream a, Stream b)
2).示例代码:

public class Demo {public static void main(String[] args) {List<String> list1 = new ArrayList<>();list1.add("张三丰");list1.add("张无忌");list1.add("张翠山");List<String> list2 = new ArrayList<>();list2.add("灭绝师太");list2.add("周芷若");list2.add("赵敏");Stream<String> stream = Stream.concat(list1.stream(),list2.stream());stream.forEach(System.out::println);}
}

18.第二章:Stream流_练习_集合元素处理的Stream方式

public class Demo {public static void main(String[] args) {List<String> one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("老子");one.add("庄子");one.add("孙子");one.add("洪七公");List<String> two = new ArrayList<>();two.add("古力娜扎");two.add("张无忌");two.add("张三丰");two.add("赵丽颖");two.add("张二狗");two.add("张天爱");two.add("张三");/*1. 第一个队伍只要名字为3个字的成员姓名;2. 第一个队伍筛选之后只要前3个人;3. 第二个队伍只要姓张的成员姓名;4. 第二个队伍筛选之后不要前2个人;5. 将两个队伍合并为一个队伍;6. 根据姓名创建 Person 对象;7. 打印整个队伍的Person对象信息。*///1. 第一个队伍只要名字为3个字的成员姓名;List<String> one1 = new ArrayList<>();for (String s : one) {if (s.length() == 3) {one1.add(s);}}//2. 第一个队伍筛选之后只要前3个人;List<String> one2 = new ArrayList<>();for (int i = 0; i < 3; i++) {one2.add(one1.get(i));}//3. 第二个队伍只要姓张的成员姓名;List<String> two1 = new ArrayList<>();for (String s : two) {if(s.startsWith("张")){two1.add(s);}}//4. 第二个队伍筛选之后不要前2个人;List<String> two2 = new ArrayList<>();for (int i = 2; i <  two1.size(); i++) {two2.add(two1.get(i));}//5. 将两个队伍合并为一个队伍;List<String> allList = new ArrayList<>();allList.addAll(one2);allList.addAll(two2);//6. 根据姓名创建 Person 对象;List<Person> perList = new ArrayList<>();for (String s : allList) {Person p = new Person(s);perList.add(p);}//7. 打印整个队伍的Person对象信息。for (Person p : perList) {System.out.println(p);}//*********************使用Stream流*********************************//Stream.concat(one.stream().filter(s -> s.length() == 3).limit(3),two.stream().filter(s-> s.startsWith("张")).skip(2)).map(Person::new)//相当于:map(s -> new Person(s)).forEach(System.out::println);}
}

19.第二章:Stream流_总结_拼接方法与终结方法

1).拼接方法:方法返回的是一个Stream流,可以继续调用流的方法。
2).终结方法:方法返回的是一个最终结果,不能再继续调用流的方法.

20.第二章:Stream流_常用方法_收集Stream结果collect方法

1).之前我们的操作都是在“流”中,但我们最终是希望将结果再存到一个集合中。这时就需要将流转换为集合。
2).示例代码:

public class Demo {public static void main(String[] args) {List<String> one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("老子");one.add("庄子");one.add("孙子");one.add("洪七公");//取出所有名字为3个字的学员,并存储到一个新集合//转为:ListList<String> list = one.stream().filter(s -> s.length() == 3).collect(Collectors.toList());System.out.println(list);//转为:SetSet<String> set = one.stream().filter(s -> s.length() == 3).collect(Collectors.toSet());System.out.println(set);//转为:数组Object[] objArray = one.stream().filter(s -> s.length() == 3).toArray();System.out.println(Arrays.toString(objArray));}
}

=================================================================
学习目标总结:
01.能够使用方法引用的常见引用方式
1).通过对象,引用成员方法:
fun(new Student()::catEat)
2).通过类名,引用静态方法:
fun(Teacher::dogEat);
3).构造方法引用:
1).无参:
fun(Cat::new);
2).有参:
fun(Cat::new,“小花”);
4).数组构造的引用:
fun(int[]::new,10);

02.能够理解流与集合相比的优点
1).流的一些操作可以生成新流,这样就可以使用链式编程,方便编写。

03.能够通过集合、映射或数组方式获取流
1).List和Set:
Stream s = list.stream();
Stream s = set.stream();
2).Map:不能获取流:
–|键流:Stream<键类型> keyStream = map.keySet().stream();
–|值流:Stream<值类型> valueStream = map.values().stream();
–|键值对流:Stream<Map.Entry> entryStream = map.entrySet().stream()
3).数组:
–|引用类型数组:
Integer[] arr = {1,2,3};
Stream stream = Stream.of(arr);
–|基本类型数组:
int[] arr = {1,2,3};
IntStream stream = IntStream.of(arr);
–|零散数据:
Stream stream = Stream.of(1,2,3,32,432,4,32);
04.能够掌握常用的流操作
1).forEach():遍历
2).filter()获取
3).count():
4).limit()
5).skip():
6).map()
7).concat()

05.能够将流中的内容收集到集合中
List list = list.stream().filter(…).collect(Collectors.toList());
Set set = list.stream().filter(…).collect(Collectors.toSet());
06.能够将流中的内容收集到数组中
Object[] objArray = list.stream().filter(…).toArray();

Java中 方法引用、Stream流、及方法实例 D190401相关推荐

  1. 【Java从入门到头秃专栏 7】语法篇(六) :Lambda表达式(->) 方法引用(::) stream流

    目录 1 Lambda表达式( -> ) ​ 2 方法引用( :: ) 3 Stream流 接下来介绍的三种语法叫:Lambda表达式 方法引用 stream流,这三种语法的使用要有特定条件,在 ...

  2. java(九)-方法引用, Stream流,File类 , 递归 ,字节流

    day09[方法引用.Lambda表达式.Stream流] 今日目标 线程状态 等待与唤醒 Lambda表达式 Stream流 教学目标 能够说出线程6个状态的名称 能够理解等待唤醒案例 能够掌握La ...

  3. 15.方法引用, Stream流,File类 , 递归 ,字节流

    JavaSE高级 Lambda表达式.方法引用.Stream流.File类 第一章 JDK8新特性 JDK新特性: Lambda 表达式 默认方法[已学习过] Stream API 方法引用 Base ...

  4. Java笔记_16(不可变集合、Stream流、方法引用)

    Java笔记_16 一.创建不可变集合 1.1.创建不可变集合的应用场景 1.2.创建不可变集合的书写格式 二.Stream流 2.1.体验Stream流 2.2.Stream流的思想和获取Strea ...

  5. Stream流、方法引用知识梳理

    Stream流.方法引用 第一章 Stream流 这里的Stream流不是IO Stream 因为Lambda引入的函数式编程在java8中有一个全新的Stream概念,用于解决已有集合类库的弊端 1 ...

  6. 2022/07/17、18 day10/11:Stream流、方法引用

    文章目录 1. Stream流 1.1 引言 1.2 流式思想概述 1.3 获取流 1.4 常用方法 1.5 练习:集合元素处理(传统方式) 1.6 练习:集合元素处理(Stream方式) 2. 方法 ...

  7. 【Stream流、方法引用】

    Java基础 第二十四章 Stream流.方法引用 今日内容 Java基础 Stream流 流与集合 传统集合的多步遍历代码 循环遍历的弊端 Stream的更优写法 流式思想概述 获取流 根据Coll ...

  8. [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递

    参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型  值传递:引用类型,地址值传递,所 ...

  9. Java中同一个文件里类和方法的引用

    Java中同一个文件里类和方法的引用 在项目开发时往往需要在同一个文件里创建几个类,并互相引用,但小白们搞不懂,所以我给大家讲解一下 目录 Java中同一个文件里类和方法的引用 1.权限修饰符 2.类 ...

  10. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

最新文章

  1. iphone8p百度云认证_探秘百度数据工厂Pingo的多存储后端数据联合查询技术
  2. HDU2112(SPFA算法)
  3. vs2010 出错:error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  4. 最优间隔分类器-SVM
  5. Express接口案例——完成文章评论相关的接口
  6. 处理页面动态加载数据
  7. CGO磁盘管理For流星无语
  8. ssq红蓝号码未出现间隔排序选号的回归计算中间率(红号出现3个以上再输出)
  9. ubuntu 安装go语言编译器 liteide
  10. Django学习笔记-settings.py详解
  11. 代码坏味道 之 17 狎昵关系 inappropriate intimacy
  12. 米的换算单位和公式_数学单位换算公式,1-6年级计算必备!
  13. 简单模拟鼠标键盘操作
  14. derek程序员英文名_访谈-Derek Powazek谈社区设计
  15. 解压chm后由hhc生成html索引页面
  16. 《C语言陷阱和缺陷》笔记
  17. B站脑机接口主流算法解析课程视频汇总
  18. 视觉SLAM⑨后端Ⅰ(KF、EKF、非线性优化)
  19. 统计:目前网上商店最热卖的五大类商品
  20. matlab 创建一个X矩阵,里面的变量从x1、x2...xn

热门文章

  1. 【复杂网络系列】复杂网络研究常用载体集
  2. 【官方文档】Fluent Bit 简介
  3. 年度盘点!Flink 社区全年的精华内容都在这里啦(内附福利)
  4. 剑指Offe面试题:用两个栈实现队列
  5. billing block
  6. 无线破解攻击工具使用详解
  7. Lenovo Y430P安装Linux无线网卡
  8. antv g6多次渲染问题解决
  9. java CGLIB动态代理
  10. django中的关联查询