在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第三十五篇博客。
本篇博客介绍了Java的Stream流。
本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11。
目录
Stream流把真正的函数式编程风格引入Java中。
- import java.util.ArrayList;
- public class stream1 {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("Hilda");
- list.add("Henri");
- list.add("Howard");
- list.add("Hermine");
- list.add("Hilary");
- list.add("Harvey");
-
- list.add("Hector");
- list.add("Helene");
- list.add("Henriette");
- list.add("Humberto");
- list.add("Hernan");
- list.add("Hanna");
-
- list.stream().filter((String s) ->{
- return (s.charAt(1) == 'e');
- }).filter((String s) -> {
- return s.length() ==6;
- }).forEach((String s) ->{
- System.out.println(s);
- });
- }
- }
程序将列表中第二个字符是e,并且长度是6的字符串输出。程序的输出是:
Hector
Helene
Hernan
生成流通过数据源(集合、数组等生成),如.stream()。
一个流后面可以跟随多个中间操作,目的是打开流,做出某种程度的程序过滤/映射,然后返回一个新的流,交给下一个操作使用。如filter()。
一个流只能有一个终结操作,执行后流就无法再操作,是流的最后一个操作,如forEach()。
Collection体系的集合可以使用默认方法stream()生成流。default Stream
Map体系的集合间接生成流。
数组可以通过Stream接口的静态方法of(T...values)生成流。
- import java.util.HashMap;
- import java.util.List;
- import java.util.ArrayList;
- import java.util.stream.Stream;
- public class stream2 {
- public static void main(String[] args){
- List
al = new ArrayList(); - Stream
s1 = al.stream(); - Set
hs = new HashSet(); - Stream
s2 = hs.stream(); -
- Map
hm = new HashMap(); - Stream
s3 = hm.keySet().stream(); - Stream
s4 = hm.values().stream(); - Stream
> s5 = hm.entrySet().stream(); -
- String[] str = new String[]{"a","b","c","d"};
- Stream
s6 = Stream.of(str); - }
- }
程序无输出。
Stream
- import java.util.ArrayList;
- public class streamfilter {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("Hilda");
- list.add("Henri");
- list.add("Howard");
- list.add("Hermine");
- list.add("Hilary");
- list.add("Harvey");
-
- list.add("Hector");
- list.add("Helene");
- list.add("Henriette");
- list.add("Humberto");
- list.add("Hernan");
- list.add("Hanna");
-
- list.stream().filter((String s) ->{
- return (s.charAt(1) == 'e');
- }).forEach((String s) ->{
- System.out.println(s);
- });
-
- System.out.println();
- list.stream().filter((String s) -> {
- return s.length() ==6;
- }).forEach((String s) ->{
- System.out.println(s);
- });
- }
- }
程序的输出是:
Henri
Hermine
Hector
Helene
Henriette
Hernan
Howard
Hilary
Harvey
Hector
Helene
Hernan
Stream
Stream
- import java.util.ArrayList;
- public class streamlimitskip {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("Hilda");
- list.add("Henri");
- list.add("Howard");
- list.add("Hermine");
- list.add("Hilary");
- list.add("Harvey");
-
- list.add("Hector");
- list.add("Helene");
- list.add("Henriette");
- list.add("Humberto");
- list.add("Hernan");
- list.add("Hanna");
-
- list.stream().limit(6).forEach((String s) ->{
- System.out.println(s);
- });
- System.out.println();
-
- list.stream().skip(6).forEach((String s) ->{
- System.out.println(s);
- });
- System.out.println();
-
- list.stream().skip(4).limit(4).forEach((String s) ->{
- System.out.println(s);
- });
- }
- }
程序的输出是:
Hilda
Henri
Howard
Hermine
Hilary
Harvey
Hector
Helene
Henriette
Humberto
Hernan
Hanna
Hilary
Harvey
Hector
Helene
static
Stream
- import java.util.ArrayList;
- import java.util.stream.Stream;
- public class streamconcatdistinct {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("Hilda");
- list.add("Henri");
- list.add("Howard");
- list.add("Hermine");
- list.add("Hilary");
- list.add("Harvey");
-
- list.add("Hector");
- list.add("Helene");
- list.add("Henriette");
- list.add("Humberto");
- list.add("Hernan");
- list.add("Hanna");
-
- Stream
s1 = list.stream().limit(10); - Stream
s2 = list.stream().skip(2); - Stream.concat(s1,s2).forEach((String s)->{
- System.out.print(s + " ");
- });
- System.out.println();
- }
- }
程序的输出是:
Hilda Henri Howard Hermine Hilary Harvey Hector Helene Henriette Humberto Howard Hermine Hilary Harvey Hector Helene Henriette Humberto Hernan Hanna
- import java.util.ArrayList;
- import java.util.stream.Stream;
- public class streamconcatdistinct {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("Hilda");
- list.add("Henri");
- list.add("Howard");
- list.add("Hermine");
- list.add("Hilary");
- list.add("Harvey");
-
- list.add("Hector");
- list.add("Helene");
- list.add("Henriette");
- list.add("Humberto");
- list.add("Hernan");
- list.add("Hanna");
-
- Stream
s1 = list.stream().limit(10); - Stream
s2 = list.stream().skip(2); -
- Stream.concat(s1,s2).distinct().forEach((String s)->{
- System.out.print(s + " ");
- });
- System.out.println();
- }
- }
程序的输出是:
Hilda Henri Howard Hermine Hilary Harvey Hector Helene Henriette Humberto Hernan Hanna
Stream
Stream
- import java.util.ArrayList;
- import java.util.Comparator;
- public class streamsort {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("Hilda");
- list.add("Henri");
- list.add("Howard");
- list.add("Hermine");
- list.add("Hilary");
- list.add("Harvey");
-
- list.add("Hector");
- list.add("Helene");
- list.add("Henriette");
- list.add("Humberto");
- list.add("Hernan");
- list.add("Hanna");
-
- list.stream().sorted().forEach((String s) ->{
- System.out.print(s + " ");
- });
- System.out.println();
-
- list.stream().sorted(new Comparator
() { - public int compare(String s1,String s2){
- return s1.length() - s2.length();
- }
- }).forEach((String s) ->{
- System.out.print(s + " ");
- });
- System.out.println();
- }
- }
程序的输出是:
Hanna Harvey Hector Helene Henri Henriette Hermine Hernan Hilary Hilda Howard Humberto
Hilda Henri Hanna Howard Hilary Harvey Hector Helene Hernan Hermine Humberto Henriette
IntStream mapToInt(ToIntFunction mapper)返回一个IntStream,其中包含将给定函数应用于此流的元素的结果。
- import java.util.ArrayList;
- public class streammapmaptoint {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("10");
- list.add("20");
- list.add("30");
- list.add("40");
- list.add("50");
-
- list.stream().map((String s) ->{
- return Integer.parseInt(s);
- }).forEach((Integer i) -> {
- System.out.println(i);
- });
- System.out.println();
-
- System.out.println(list.stream().mapToInt((String s) ->{
- return Integer.parseInt(s);
- }).sum());
- }
- }
程序的输出是:
10
20
30
40
50
150
void forEach(Consumer action)对此流的每个元素执行操作。
long count()返回此流的元素数。
- import java.util.ArrayList;
- public class streamforeachcount {
- public static void main(String[] args){
- ArrayList
list = new ArrayList(); - list.add("Hilda");
- list.add("Henri");
- list.add("Howard");
- list.add("Hermine");
- list.add("Hilary");
- list.add("Harvey");
-
- list.add("Hector");
- list.add("Helene");
- list.add("Henriette");
- list.add("Humberto");
- list.add("Hernan");
- list.add("Hanna");
-
- list.stream().forEach((String s)->{
- System.out.println(s);
- });
- System.out.println(list.stream().count());
- }
- }
程序的输出是:
Hilda
Henri
Howard
Hermine
Hilary
Harvey
Hector
Helene
Henriette
Humberto
Hernan
Hanna
12
- public class actor {
- private String name;
- actor(){}
- actor(String name){
- this.name = name;
- }
-
- public void setname(String name){
- this.name = name;
- }
-
- public String getname(){
- return name;
- }
- }
这是actor类,有成员变量name。
- import java.util.ArrayList;
- import java.util.stream.Stream;
- public class streamtest {
- public static void main(String[] args){
- ArrayList
manlist = new ArrayList(); - actor man1 = new actor("Peter");
- actor man2 = new actor("Philippe");
- actor man3 = new actor("Pablo");
- actor man4 = new actor("Paine");
- actor man5 = new actor("Paul");
- actor man6 = new actor("Polo");
- manlist.add(man1);
- manlist.add(man2);
- manlist.add(man3);
- manlist.add(man4);
- manlist.add(man5);
- manlist.add(man6);
-
- ArrayList
womanlist = new ArrayList(); - actor woman1 = new actor("Paula");
- actor woman2 = new actor("Patty");
- actor woman3 = new actor("Paulette");
- actor woman4 = new actor("Pamela");
- actor woman5 = new actor("Pilar");
- actor woman6 = new actor("Priscilla");
- womanlist.add(woman1);
- womanlist.add(woman2);
- womanlist.add(woman3);
- womanlist.add(woman4);
- womanlist.add(woman5);
- womanlist.add(woman6);
-
- Stream
man = manlist.stream().filter((actor act)->{ - return (act.getname().length() < 6);
- }).limit(4);
- Stream
woman = womanlist.stream().filter((actor act)->{ - return (act.getname().length() < 9);
- }).skip(2);
-
- Stream
people = Stream.concat(man,woman); - people.forEach((actor act)->{
- System.out.println(act.getname());
- });
- }
- }
程序创建了两个存储actor类对象的ArrayList集合,分别加入6个对象,随后按条件进行操作。
程序的输出是:
Peter
Pablo
Paine
Paul
Paulette
Pamela
Pilar
工具类Collectors提供了具体收集方式,把流中的数据收到集合中:
public static
public static
public static Collector toMap(Function keyMapper,Function valueMapper)将元素收集到Map集合中。
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.Set;
- import java.util.stream.Collectors;
- import java.util.stream.Stream;
- public class streamcollect {
- public static void main(String[] args){
- ArrayList
strlist = new ArrayList(); - strlist.add("Pamela");
- strlist.add("Peter");
- strlist.add("Paine");
- strlist.add("Paula");
- strlist.add("Pilar");
- strlist.add("Philippe");
-
- strlist.add("Paul");
- strlist.add("Patty");
- strlist.add("Priscilla");
- strlist.add("Pablo");
- strlist.add("Polo");
- strlist.add("Paulette");
-
- Stream
s1 = strlist.stream().filter((String s)->{ - return s.length() < 7;
- });
- ArrayList
s1list = (ArrayList) s1.collect(Collectors.toList()); - for(String s:s1list){
- System.out.print(s + " ");
- }
- System.out.println();
-
- HashSet
intset = new HashSet(); - intset.add(21);
- intset.add(19);
- intset.add(22);
- intset.add(16);
- intset.add(20);
- intset.add(23);
-
- Stream
s2 = intset.stream().filter((Integer i) ->{ - return i > 18;
- });
-
- HashSet
s2set = (HashSet) s2.collect(Collectors.toSet()); - for(Integer i:s2set){
- System.out.println(i + " ");
- }
- System.out.println();
-
- String[] strarr = new String[]{"Pamela,21","Peter,18","Paine,16","Paula,22","Pilar,15","Philippe,21",
- "Paul,20","Patty,20","Priscilla,19","Pablo,23","Polo,18","Paulette,22"};
- Stream
s3 = Stream.of(strarr).filter((String s) ->{ - return Integer.parseInt(s.split(",")[1]) > 18;
- });
-
- HashMap
s3map = (HashMap) s3.collect(Collectors.toMap((String s) ->{ - return s.split(",")[0];
- },(String s) ->{
- return Integer.parseInt(s.split(",")[1]);
- }));
-
- Set
hs = s3map.keySet(); - for(String s:hs){
- System.out.println(s + s3map.get(s));
- }
- }
- }
程序的输出是:
Pamela Peter Paine Paula Pilar Paul Patty Pablo Polo
19 20 21 22 23
Pablo23
Philippe21
Pamela21
Priscilla19
Paulette22
Paula22
Paul20
Patty20