当前位置: 首页 > news >正文

虎门网站建设推广论坛seo招聘

虎门网站建设推广,论坛seo招聘,广东网络制作,国家高新技术企业查询所属专栏:Java学习 Stream流是JDK 8引入的一个概念,它提供了一种高效且表达力强的方式来处理数据集合(如List、Set等)或数组。Stream API可以以声明性方式(指定做什么)来处理数据序列。流操作可以被分为两大…

 所属专栏:Java学习

在这里插入图片描述

Stream流是JDK 8引入的一个概念,它提供了一种高效且表达力强的方式来处理数据集合(如List、Set等)或数组。Stream API可以以声明性方式(指定做什么)来处理数据序列。流操作可以被分为两大类:中间操作(Intermediate Operations)和终端操作(Terminal Operations)。

🍁1. Stream流的适用对象

先得到一条Stream流,并把数据放上去,再进行中间操作和终端操作

获取方式方法名说明
单列集合default Stream<E>stream()Collection中的默认方法
双列集合无法直接使用Stream流
数组public static <T> Stream<T> stream(T[] array)Arrays工具类中的静态方法
一堆零散数据public static <T> Stream<T> of(T...values)Stream接口中的静态方法

 先来看单列集合的例子:

public class Demo1 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "a", "b", "c", "d", "e");// 获取Stream流,把集合中的数据放到流上Stream<String> stream1 = arrayList.stream();//内部类方式打印stream1.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.print(s);}});System.out.println();//获取流之后直接通过lambda表达式进行打印arrayList.stream().forEach(s -> System.out.print(s));}
}

对于双列集合,需要通过keySet() 或 entrySet() 转化为单列集合,再获取Stream 

public class Demo2 {public static void main(String[] args) {HashMap<String,Integer> hashMap = new HashMap<>();hashMap.put("aaa",1);hashMap.put("bbb",2);hashMap.put("ccc",3);hashMap.put("ddd",4);//双列集合第一种获取Stream流hashMap.keySet().stream().forEach(s -> System.out.print(s + " "));System.out.println();//双列集合第二种获取hashMap.entrySet().stream().forEach(s -> System.out.print(s + " "));}
}

 数组获取Stream流:

public class Demo3 {public static void main(String[] args) {int[] arr1 = {1, 2, 3, 4, 5};String[] arr2 = {"a", "b", "c", "d"};//获取Stream流Arrays.stream(arr1).forEach(s-> System.out.print(s + " "));System.out.println();//数组中是引用型数据类型也可以获取Stream流Arrays.stream(arr2).forEach(s -> System.out.print(s + " "));}
}

 对于不存储在数组或集合中的零散数据,可以直接通过Stream接口中的静态方法获取

public class Demo4 {public static void main(String[] args) {Stream.of(1,2,3,4,5).forEach(s-> System.out.print(s + " "));System.out.println();Stream.of("a","b","c").forEach(s-> System.out.print(s + " "));}
}

🍁2. 中间方法

中间操作:中间操作可以返回流本身,因此可以链式调用多个中间操作,中间操作可以是对流的过滤(如filter)、映射(如map)、排序(如sorted)等 

在上面的中间方法时,只会修改Stream流中的数据,不会影响原来集合或数组中的数据,并且原来的流只能使用一次

🍁2.1 filter()

filter 的参数 Predicate 是一个函数式接口 ,所以可以先使用匿名内部类的方式,再用 lambda 表达式

public class Demo5 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "aaa", "abc", "acb", "aa", "bb", "cc");//fitlter 过滤 把a开头的留下,其余数据不要arrayList.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//返回值为true,当前数据留下,返回值为false,当前数据舍弃return s.startsWith("a");}}).forEach(s -> System.out.print(s + " "));System.out.println();// lambda表达式的形式arrayList.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.print(s + " "));System.out.println();//把stream流暂时接收的方式Stream<String> stream1 = arrayList.stream().filter(s -> s.startsWith("a"));stream1.forEach(s -> System.out.print(s + " "));}
}

由于Stream流只能用一次,如果之前的流已经被使用过,再次使用就会报错 

 所以说,由于只能使用一次,再用一个变量取接收也没有什么意义,直接使用链式编程就可以了

 并且,使用流之后,原来集合中的元素也不会改变

🍁2.2 limit() 和 skip()

/* limit() 获取前面几个元素skip() 跳过几个元素*/arrayList.stream().limit(3).forEach(s -> System.out.print(s + " "));System.out.println();arrayList.stream().skip(3).forEach(s -> System.out.print(s + " "));

🍁2.3 distinct()和concat()

distinct()去重是依赖hashCode()和equals()方法的,所以如果是自定义类型,要手动的重写这两个方法

public class Demo6 {public static void main(String[] args) {ArrayList<String> arrayList1 = new ArrayList<>();Collections.addAll(arrayList1, "aaa", "aaa", "acb", "aa", "bb", "cc");ArrayList<String> arrayList2 = new ArrayList<>();Collections.addAll(arrayList2,"dd","ee");//去重arrayList1.stream().distinct().forEach(s -> System.out.print(s + " "));System.out.println();//流的合并Stream.concat(arrayList1.stream(),arrayList2.stream()).forEach(s -> System.out.print(s + " "));}
}

🍁2.4 map()

需求:获取集合中的数字部分

首先调用split方法进行分割,得到数字部分之后再转换为整型

public class Demo7 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "aaa-11", "acb-22", "aa-33", "bb-44", "cc-55");// 获取集合中的数字部分arrayList.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {//使用split进行分割String[] arr = s.split("-");//获取数字部分String num = arr[1];//转换为int类型int ans = Integer.parseInt(num);return ans;}}).forEach(s -> System.out.print(s + " "));System.out.println();//lambda表达式arrayList.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s -> System.out.print(s + " "));}
}

🍁3. 终结方法

名称说明
void forEach(Consumer action)遍历
long count()统计
toArray()收集流中的数据,放到数组中
collect(Collector collector)收集流中的数据,放到集合中

🍁3.1 forEach()和count()

forEach方法在之前已经演示过了,就是进行遍历的

forEach中的参数Consumer也是一个函数式接口,也可以先使用匿名内部类的方式,再用 lambda 表达式

public class Demo8 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "aaa", "aaa", "acb", "aa", "bb", "cc");arrayList.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.print(s + " ");}});System.out.println();arrayList.forEach(s-> System.out.print(s + " "));System.out.println();//统计个数long l = arrayList.stream().count();System.out.println(l);}
}

count() 的返回值为long类型的,可以定义一个变量进行接收 

🍁3.2 toArray()

toArray()是收集流里面的数据放在数组中

toArray()方法有两种返回类型,一种是Object类型的,另一种是指定类型的,Object类型的比较简单,直接用Object类型的变量来接收就可以了

public class Demo9 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "aaa", "aaa", "acb", "aa", "bb", "cc");Object[] array1 = arrayList.stream().toArray();System.out.println(Arrays.toString(array1));}
}

接下来看指定类型

 toArray方法的参数也是一个函数式接口,还是使用匿名内部类和lambda表达式两种方式演示

public class Demo9 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "aaa", "aaa", "acb", "aa", "bb", "cc");//IntFunction的泛型:具体类型的数组//apply方法的形参:流中数据的个数,返回的数组的长度要一致//返回值就是具体类型的数组String[] array2 = arrayList.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(array2));//lambda表达式String[] array = arrayList.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(array));}
}

IntFunction的泛型是具体类型的数组
apply方法的形参表示流中数据的个数,返回的数组的长度要一致,最后的返回值就是具体类型的数组 

🍁3.3 collect() 

collect() 方法就是收集流里面的数据放到集合中,下面先来演示收集到List和Set集合中的例子

public class Demo10 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();Collections.addAll(arrayList, "张三-男-23", "李四-男-21", "王五-女-22", "钱七-女-22");// 把所有男性收集起来//收集到List集合中List<String> list = arrayList.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());//收集到Set集合中Set<String> set = arrayList.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet());}
}

收集到List和Set集合中的数据的区别还是和List和Set集合的区别一样的,Set集合中不能有重复的元素,如果流中收集的数据存在重复的数据,在收集到Set集合之后就会进行去重

接下来看Map集合,由于Map集合是一个双列集合,所以需要指定键和值的生成规则

 这里的生成规则比较复杂

//收集到Map集合中/*** toMap : 参数一表示键的生成规则*         参数二表示值的生成规则* 参数一:* Function 泛型一:表示流中的数据类型*          泛型二:表示Map集合中键的类型* 方法 apply 形参:表示流中的每一个数据*           方法体:生成键的代码*           返回值:已经生成的键**/Map<String, Integer> map1 = arrayList.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}}, new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));System.out.println(map1);
//lambda表达式Map<String, Integer> map2 = arrayList.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[2])));System.out.println(map2);

 由于Map集合中是不能有重复的键的,所以如果Stream流获取的键中存在了重的元素,就会报错

🍁4. Stream流的作用和使用步骤总结

作用:Stream流就是结合了lambda表达式,简化集合和数组的操作

使用步骤:

1. 获取Stream流对象

2.使用中间方法处理数据

3.使用终结方法处理数据

在这里插入图片描述

http://www.zhongyajixie.com/news/25078.html

相关文章:

  • 2345浏览器免费版百度seo工作室
  • 免费生成网页的网站企业宣传推广
  • 山东企业网站建设百度咨询电话 人工客服
  • 网站开发流程步骤关键词优化课程
  • 自己做的网站打不开了seo营销方案
  • 网上那个网站做席子批发谷歌搜索引擎免费入口 台湾
  • 利用已有网站 制作悟空建站seo服务
  • 网站公安局备案 所需要的材料查询网站流量的网址
  • 做网站为职业生存不下去seo基础入门免费教程
  • 网站推广打包关键词排名优化系统
  • 广水网站建设北京网站优化公司哪家好
  • 如何做的网站手机可以用南京seo网站优化
  • 产教融合信息门户网站建设方案企业网页设计与推广
  • 一站式网站上海网站排名推广
  • 网站制作案例市场搜索百度网址网页
  • 做线上交互的网站网站流量统计分析工具
  • 做网站最主要上海百度竞价
  • 郑州做网站的多不多搜索引擎优化报告
  • 网站加入联盟哪些网站是营销型网站
  • 外贸网站如何建站近10天的时事新闻
  • 做网站的步骤的文本百度竞价入口
  • 北京的网站建设公司seo关键词排名优化费用
  • wordpress收录温州seo教程
  • 南宫建设局网站首页今日新闻 最新消息 大事
  • 住房和城乡建设岗位评定网站站长工具樱花
  • 模仿网站怎么防止侵权临沂google推广
  • 淘宝客建网站北京seo优化服务
  • 拉萨做网站公司百度地图人工客服电话
  • 太原有做网站的吗武汉seo和网络推广
  • 怎么做原创动漫视频网站腾讯企点app