Java Stream流
创建不可变集合
所谓的不可变集合是指不可以被修改的集合,即长度不可修改、内容也不可修改
不可变集合应用场景:
不想让别人修改集合里的内容
如何创建不可变的集合:
在List、Set、Map
接口中,都存在静态的of
方法,可以获取一个不可变的集合,这个集合不能添加,不能删除,也不能修改
注意:of
方法在JDK9
里面才有

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.example;
import java.util.List;
public class UnMutableDemo { public static void main(String[] args) { List<String> stringList = List.of("张三", "李四", "王五", "赵六"); for (String s : stringList) { System.out.println(s); } stringList.add("12"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| public class UnMutableDemo { public static void main(String[] args) { List<String> lists = new ArrayList<>(); lists.add("12"); lists.add("32"); lists.add("56"); lists.remove(1); List<String> unMutateList = List.copyOf(lists); System.out.println(unMutateList); } }
|
Stream流
背景

如果用常规for
循环遍历的话,代码会非常繁琐,但是用stream
流会非常简洁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class StreamDemo { public static void main(String[] args) { List<String> nameList = new ArrayList<>(); nameList.add("张无忌"); nameList.add("周芷若"); nameList.add("赵敏"); nameList.add("张强"); nameList.add("张三丰"); List<String> newNameList1 = new ArrayList<>(); for (String s : nameList) { if(s.startsWith("张") && s.length()==3){ newNameList1.add(s); } } System.out.println(newNameList1); List<String> newNameList2 = nameList.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).collect(Collectors.toList()); System.out.println(newNameList2); } }
|
Stream流使用
stream流使用步骤


获取stream流

对于双列集合(map)需要先调用keySet
或者entrySet
转换成单列集合,再调用Stream
方法获取流水线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| public class StreamDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); Collections.addAll(list,"张三","李四","王五","赵六"); list.stream().forEach(item-> System.out.println(item));
Map<String,Integer> map = new HashMap<>(); map.put("张三",100); map.put("李四",200); map.put("王五",300); map.put("赵六",400); map.keySet().stream().forEach(s-> System.out.println(s+"="+map.get(s))); map.entrySet().stream().forEach(s-> System.out.println(s));
String[] hobbys = {"篮球","足球","乒乓球","橄榄球"}; Arrays.stream(hobbys).forEach(s-> System.out.println(s));
Stream.of("小学","初中","高中","大学").forEach(s-> System.out.println(s)); } }
|
Stream流中间方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| public class example { List<String> nameList=null; @Before public void init(){ nameList = new ArrayList<>(); Collections.addAll(nameList,"曹操","司马懿","赵云","关云长","写宅院");
} @Test public void testFilter(){ nameList.stream().filter(name->name.length()>=3).forEach(name-> System.out.println(name)); }
@Test public void TestLimit(){ nameList.stream().limit(3).forEach(name-> System.out.println(name));
}
@Test public void TestSkip(){ nameList.stream().skip(3).forEach(name-> System.out.println(name));
}
@Test public void TestDistict(){ List<Integer> list = new ArrayList<>(); Collections.addAll(list,21,23,22,9,80,22,9); list.stream().distinct().forEach(s-> System.out.print(s+" ")); }
@Test public void TestConcat(){ List<String> list1 = new ArrayList<>(); Collections.addAll(list1,"中国","日本","韩国","朝鲜"); List<String> list2 = new ArrayList<>(); Collections.addAll(list2,"英国","法国","德国"); Stream.concat(list1.stream(),list2.stream()).forEach(s-> System.out.print(s+" ")); }
@Test public void TestMap(){ List<Integer> list = new ArrayList<>(); Collections.addAll(list,3,5,7,1,9); list.stream().map(i->i*i+10).forEach(s-> System.out.print(s+" ")); } }
|
Stream流中间方法

1 2 3 4 5 6 7 8 9 10
| @Test public void TestCount(){ List<Integer> list = new ArrayList<>(); Collections.addAll(list,3,5,7,1,9); long count = list.stream().count(); System.out.println(count);
}
|
1 2 3 4 5 6 7 8 9
| @Test public void TestToArray(){ List<String> list = new ArrayList<>(); Collections.addAll(list,"中国","日本","韩国","朝鲜"); String[] array = list.stream().toArray(value -> new String[value]); System.out.println(Arrays.toString(array)); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| @Test public void TestToList(){ List<String> list = new ArrayList<>(); Collections.addAll(list,"关羽-男-32","刘备-男-38","张飞-男-23","貂蝉-女-12","孙尚香-女-31"); List<String> nameList = list.stream() .filter(s -> "男".equals(s.split("-")[1])) .map(s -> s.split("-")[0]) .collect(Collectors.toList()); System.out.println(nameList); } @Test public void TestToSet(){ List<String> list = new ArrayList<>(); Collections.addAll(list,"关羽-男-32","刘备-男-38","张飞-男-23","貂蝉-女-12","孙尚香-女-31"); Set<String> nameSet = list.stream() .filter(s -> "男".equals(s.split("-")[1])) .map(s -> s.split("-")[0]) .collect(Collectors.toSet()); System.out.println(nameSet); }
@Test public void TestToMap(){ List<String> list = new ArrayList<>(); Collections.addAll(list,"关羽-男-32","刘备-男-38","张飞-男-23","貂蝉-女-12","孙尚香-女-31");
Map<String, Integer> map = list.stream().collect(Collectors.toMap( s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[2]) )); System.out.println(map); }
|