Stream:数据流
中间方法: filter【过滤】 limit【获取前几个数据】 skip【跳过前几个数据】
distinct【去重】 concat【合并】 map【转换流中的数据类型】
终结方法: foreach 【遍历】 count【统计】 toArray【收集数据到数组中】
collect【收集数据到集合中】
注意点:中间方法返回一个新的Stream流,原本的Stream流只能使用一次,建议使用链式编程
修改Stream流中的数据,不会影响原来的数据
1 package com.Lucky; 2 3 import java.util.*; 4 import java.util.function.Function; 5 import java.util.function.IntFunction; 6 import java.util.stream.Collectors; 7 import java.util.stream.Stream; 8 9 /* 10 Stream:数据流 11 中间方法: filter【过滤】 limit【获取前几个数据】 skip【跳过前几个数据】 12 distinct【去重】 concat【合并】 map【转换流中的数据类型】 13 14 终结方法: foreach 【遍历】 count【统计】 toArray【收集数据到数组中】 15 collect【收集数据到集合中】 16 17 注意点:中间方法返回一个新的Stream流,原本的Stream流只能使用一次,建议使用链式编程 18 修改Stream流中的数据,不会影响原来的数据 19 */ 20 public class StreamDemo1 { 21 /** 22 * 要求: 1.将姓张的开头的元素添加到新集合中 23 * 2.将姓张的开头并且长度为3的元素添加到新集合中 24 * 3.遍历打印最终结果 25 */ 26 27 28 public static void main(String[] args) { 29 //1.原始做法 30 System.out.println("-------- //1.原始做法---------"); 31 ArrayList<String> arr1=new ArrayList<>(); 32 Collections.addAll(arr1,"张三","张无忌","张断三","唯易","王八蛋","赛亚人","张天"); 33 34 35 ArrayList<String> arr2=new ArrayList<>(); 36 for (String s : arr1) { 37 if(s.startsWith("张")){ //以张开头的数据 38 arr2.add(s); 39 } 40 } 41 ArrayList<String> arr3=new ArrayList<>(); 42 for (String m : arr2) { 43 if(m.length()==3){ //以张开头的数据并且长度为3 44 arr3.add(m); 45 } 46 } 47 48 System.out.println(arr1); 49 System.out.println(arr2); 50 System.out.println(arr3); 51 52 53 System.out.println("-------- //2.Stream数据流做法---------"); 54 System.out.println("------- filter【过滤】-----------"); 55 arr1.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3) 56 .forEach(strName-> System.out.println(strName)); 57 58 59 System.out.println("------- limit【获取前几个数据】-----------"); 60 arr1.stream().limit(5).limit(3) 61 .forEach(val-> System.out.println(val)); 62 63 System.out.println("------- skip【跳过前几个数据】-----------"); 64 arr1.stream().skip(3).skip(3) 65 .forEach(val-> System.out.println(val)); 66 67 System.out.println("------- distinct【去重】-----------"); 68 ArrayList<String> arr=new ArrayList<>(); 69 Collections.addAll(arr,"张三","王八蛋","赛亚人","王八蛋","赛亚人","张三","精英"); 70 arr.stream().distinct().forEach(val-> System.out.println(val)); 71 72 System.out.println("------- concat【合并】-----------"); 73 Stream.concat(arr.stream(),arr1.stream()).forEach(val-> System.out.println(val)); 74 75 76 System.out.println("------- map 【转换流中的数据类型】-----------"); 77 ArrayList<String> arrStr=new ArrayList<>(); 78 Collections.addAll(arrStr,"BUG=999+","王八蛋=666+","赛亚人=555-"); 79 /* 80 String:原本流的数据类型 81 Integer:要转换成的数据类型 82 */ 83 arrStr.stream().map(new Function<String, Integer>() { 84 @Override 85 public Integer apply(String s) { 86 //将字符串转换成字符串数组 87 String[] strArr=s.split("="); 88 String tempVar=strArr[1]; //获取=之后的数据 例如:999+ 89 //截取字符串 90 tempVar = tempVar.substring(0,tempVar.length()-1); 91 //转换成int类型 92 int age=Integer.parseInt(tempVar); 93 94 return age; 95 } 96 }).forEach(val-> System.out.println(val)); 97 98 99 System.out.println("---//lamda表达式写法 转换成int类型----"); 100 arrStr.stream().map(s->Integer.parseInt(s.split("=")[1].substring(0,3))) 101 .forEach(val-> System.out.println(val)); 102 103 104 105 106 107 ///////////////////////////////////////////////////////////////////////////////////////////// 108 System.out.println("===============终结方法======================="); 109 /** 110 * 终结方法: foreach 【遍历】 count【统计】 toArray【收集数据到数组中】 111 * collect【收集数据到集合中】 112 */ 113 arr1.stream().forEach(strName-> System.out.println(strName)); 114 115 System.out.println(arr.stream().count()); 116 117 System.out.println("-------toArray------"); 118 Object[] objects = arrStr.stream().toArray(); 119 System.out.println(Arrays.toString(objects)); 120 121 /* 122 new IntFunction<具体类型的数组> 123 value :流中数据的个数 124 返回值 :具体类型的数组 125 */ 126 String[] atr= arr1.stream().toArray(new IntFunction<String[]>() { 127 @Override 128 public String[] apply(int value) { 129 return new String[value]; 130 } 131 }); 132 System.out.println(Arrays.toString(atr)); //转换成String字符串打印出来 133 134 //使用lamda表达式 135 String[] v= arr1.stream().toArray(value-> new String[value]); 136 System.out.println(Arrays.toString(v)); //转换成String字符串打印出来 137 138 139 System.out.println("-------collect:------"); 140 141 ArrayList<String> OK=new ArrayList<>(); 142 Collections.addAll(OK,"张三-男-500","王八蛋-男-60","唯易-男-22","小微-女-21","李四-男-300"); 143 144 //要求:将男的收集到list集合中 145 List<String> collectList = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 146 .collect(Collectors.toList()); 147 System.out.println(collectList); 148 149 //要求:将男的收集到Set集合中【跟list集合不同的地方:自动去重】 150 Set<String> collectSet = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 151 .collect(Collectors.toSet()); 152 System.out.println(collectSet); 153 154 155 System.out.println("-------注意点:要储存在Map集合中,键不能重复,不然就报错----------"); 156 System.out.println("---初级:匿名内部类写法----"); 157 158 //要求:将男的收集到Map集合中【要确定哪个作为键,哪个作为值】 159 // 用姓名作为键,将年龄作为值 张三-男-500 160 Map<String, Integer> collectMap = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 161 .collect(Collectors.toMap( 162 //参数一:定义键的生成规则 163 // new Function<原本流中的数据类型, 键的数据类型> 164 // apply(原本流中的数据类型 s) 165 // return: 返回生成的键 166 new Function<String, String>() { 167 @Override 168 public String apply(String s) { 169 String name = s.split("-")[0]; 170 return name; 171 } 172 }, 173 //参数二:定义值的生成规则 174 // new Function<原本流中的数据类型, 值的数据类型> 175 // apply(原本流中的数据类型 流里面的每一个数据) 176 // return: 返回生成的值 177 new Function<String, Integer>() { 178 @Override 179 public Integer apply(String s) { 180 String age = s.split("-")[2]; 181 return Integer.parseInt(age); 182 } 183 })); 184 System.out.println(collectMap); 185 186 187 System.out.println("---高级:lamda表达式写法----"); 188 Map<String, Integer> collectLam = OK.stream().filter(val -> "男".equals(val.split("-")[1])) 189 .collect(Collectors.toMap(ki ->ki.split("-")[0], 190 vi ->Integer.parseInt(vi.split("-")[2]))); 191 System.out.println(collectLam); 192 } 193 }
标签:基本,val,Stream,System,println,String,数据流,stream,out From: https://www.cnblogs.com/Lucky-only/p/16970932.html