多次循环,繁琐,过滤数组

1.8之后出的Steam流

List<String> list = new ArrayList<>();list.add("张顺");list.add("和你");list.add("张牛");list.add("张强");list.add("王子龙");//对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中//对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中//遍历listB集合list.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(name-> System.out.println(name));

获取流

所有的 Collection 集合都可以通过 stream 默认方法获取流;
Stream 接口的静态方法 of 可以获取数组对应的流。

public static void main(String[] args) {//把集合转换为Stream流List<String> list = new ArrayList<>();Stream<String> stream1 = list.stream();Set<String> set = new HashSet<>();Stream<String> stream2 = set.stream();Map<String,String> map = new HashMap<>();//获取键,存储到一个Set集合中Set<String> keySet = map.keySet();Stream<String> stream3 = keySet.stream();//获取值,存储到一个Collection集合中Collection<String> values = map.values();Stream<String> stream4 = values.stream();//获取键值对(键与值的映射关系 entrySet)Set<Map.Entry<String, String>> entries = map.entrySet();Stream<Map.Entry<String, String>> stream5 = entries.stream();//把数组转换为Stream流Stream<Integer> stream6 = Stream.of(1, 2, 3, 4, 5);//可变参数可以传递数组Integer[] arr = {1,2,3,4,5};Stream<Integer> stream7 = Stream.of(arr);String[] arr2 = {"a","bb","ccc"};Stream<String> stream8 = Stream.of(arr2);}
逐一处理:forEach

终结方法
遍历
该方法接收一个 Consumer 接口函数
法void accept(T t),

过滤:filter

该接口接收一个 Predicate 函数式接口参数
boolean test(T t);

映射:map

该接口需要一个 Function 函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。
R apply(T t);

统计个数:count

终结方法
long count();

取用前几个:limit

Stream limit(long maxSize);

跳过前几个:skip

Stream skip(long n)

组合:concat

如果有两个流,希望合并成为一个流,那么可以使用 Stream 接口的静态方法 concat :
static Stream concat(Stream<? extends T> a, Stream<? extends T> b)

 public static void main(String[] args) {//第一支队伍ArrayList<String> one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("石破天");one.add("石中玉");one.add("老子");one.add("庄子");one.add("洪七公");//1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。//2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中。Stream<String> oneStream = one.stream().filter(name -> name.length() == 3).limit(3);//第二支队伍ArrayList<String> two = new ArrayList<>();two.add("古力娜扎");two.add("张无忌");two.add("赵丽颖");two.add("张三丰");two.add("尼古拉斯赵四");two.add("张天爱");two.add("张二狗");//3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中。//4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中。Stream<String> twoStream = two.stream().filter(name -> name.startsWith("张")).skip(2);//5. 将两个队伍合并为一个队伍;存储到一个新集合中。//6. 根据姓名创建Person对象;存储到一个新集合中。//7. 打印整个队伍的Person对象信息。Stream.concat(oneStream,twoStream).map(name->new Person(name)).forEach(p-> System.out.println(p));}

方法引用

其中的双冒号 :: 写法,这被称为“方法引用”

printString((s) -> {System.out.println(s);});/*分析:Lambda表达式的目的,打印参数传递的字符串把参数s,传递给了System.out对象,调用out对象中的方法println对字符串进行了输出注意:1.System.out对象是已经存在的2.println方法也是已经存在的所以我们可以使用方法引用来优化Lambda表达式可以使用System.out方法直接引用(调用)println方法*/printString(System.out::println);

Lambda表达式: n -> Math.abs(n)
方法引用: Math::abs

Lambda表达式: () -> super.sayHello()
方法引用: super::sayHello

Lambda表达式: () -> this.buyHouse()
方法引用: this::buyHouse

类的构造器引用

由于构造器的名称与类名完全一样,并不固定。所以构造器引用使用 类名称::new 的格式表示。
Lambda表达式: name -> new Person(name)
方法引用: Person::new

数组的构造器引用

Lambda表达式: length -> new int[length]
方法引用: int[]::new

    定义一个创建数组的函数式接口*/
@FunctionalInterface
public interface ArrayBuilder {//定义一个创建int类型数组的方法,参数传递数组的长度,返回创建好的int类型数组int[] builderArray(int length);
}
import java.util.Arrays;/*数组的构造器引用*/
public class Demo {/*定义一个方法方法的参数传递创建数组的长度和ArrayBuilder接口方法内部根据传递的长度使用ArrayBuilder中的方法创建数组并返回*/public static int[] createArray(int length, ArrayBuilder ab){return  ab.builderArray(length);}public static void main(String[] args) {//调用createArray方法,传递数组的长度和Lambda表达式int[] arr1 = createArray(10,(len)->{//根据数组的长度,创建数组并返回return new int[len];});System.out.println(arr1.length);//10/*使用方法引用优化Lambda表达式已知创建的就是int[]数组数组的长度也是已知的就可以使用方法引用int[]引用new,根据参数传递的长度来创建数组*/int[] arr2 =createArray(10,int[]::new);System.out.println(Arrays.toString(arr2));System.out.println(arr2.length);//10}
}

Steam流-方法引用相关推荐

  1. Java基础 Stream流方法引用异常文件

    Stream流 引例 需求:按照下面要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 1. 把所有以"曹"开头的元素存储到新集合中 2. 把曹开头,长度为3的元素存储到新 ...

  2. Stream流方法引用

    一.对象存在,方法也存在,双冒号引用 1.方法引用的概念: 使用实例: 1.1先定义i一个函数式接口: 1.2定义一个入参参数列表有函数式接口的方法: 1.3调用这个入参有函数式接口的方法: lamb ...

  3. Sream流、方法引用

    目录 Stream流 方法引用 Stream流 Stream(流)是一个来自数据源的元素队列 元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需计算 数据源 流的来 ...

  4. Steam流和方法引用:

    1.不可变集合 1.1 什么是不可变集合 是一个长度不可变,内容也无法修改的集合 1.2 使用场景 如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践. 当集合对象被不可信的库调用时 ...

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

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

  6. 【Java】Stream流和方法引用

    1 Stream流 1.1 Stream流优化过滤集合 传统方式 用一个循环过滤姓张的人 用一个循环过滤名字长度大于2的人 public static void main(String[] args) ...

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

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

  8. jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式

    1.单例设计模式 1.概念: 设计模式:使用固有的流程或方式设计出来的类接口.枚举等元素 2.设计原则: 1.私有化构造方法[private.protected] 2.类中创建最终对象[唯一不能被赋值 ...

  9. java day24【Stream流、方法引用】

    第一章 Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带来的 ...

最新文章

  1. 快做这 15点,让 SpringBoot 启动更快一点!
  2. 《魂斗罗:归来》手游子弹中没中,没你想得那么简单!
  3. Abp mysql guid_ABP领域层 – 值对象 - ABP 中文文档
  4. java adt入门教程_【教程】【多图详解】如何在Eclipse中离线安装ADT(Android Development Tools)...
  5. html label 两端对齐,如果实现表单的label文字两端对齐
  6. spring5.0学习笔记6
  7. 3dB等波纹低通滤波器设计(HFSS)
  8. Bingo说说:私域创富之万能获客法,一招吃遍天下
  9. 【算法】扩展卢卡斯详解
  10. js bind 传参、_Node.js 在微医的应用场景及实践
  11. 生死看淡,不服就GAN(四)---- 用全连层GAN生成MNIST手写体
  12. 六、Hystrix详解三:Hystrix的健康监测
  13. SLUB和SLAB的区别
  14. CC2640R2F学习笔记(一.开发环境)
  15. 花盆Flowerpot[USACO12MAR]
  16. 网站优化(提高网站访问量)
  17. ADS-B接收机Radarcape支持多点定位MLAT(选配acars)
  18. [论文阅读] (14)英文论文实验评估(Evaluation)如何撰写及精句摘抄(上)——以入侵检测系统(IDS)为例
  19. muduo源码剖析——以三个切片浅析muduo库代码设计的严谨性、高效性与灵活性
  20. TI AM335x 可编程实时模块(PRUSS)详解

热门文章

  1. 拉曼光谱仪的原理与应用——TFN 7G F660手持式拉曼光谱识别仪
  2. 解决Mac系统启动台图标顺序混乱的问题
  3. CodeWarriorV6.1在Win10 64位系统下安装及使用
  4. C语言练习3—数组法和指针法输出二维数组
  5. zero 免焊 树莓派_树莓派 Zero WH 初使用体验
  6. Docker入门实践
  7. automake生成静态库文件_Automake 详解
  8. 1014 福尔摩斯的约会 (20 分)测试点分析
  9. 乐视电视发布声明,谴责电商平台强迫为其价格补贴买单
  10. 数据库事务介绍(二)如何使用事务