• Java学习笔记(三十五)


    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度。现在将跟着视频做的笔记进行整理。本篇博客是整理Java知识点的第三十五篇博客。

    本篇博客介绍了Java的Stream流

    本系列博客所有Java代码都使用IntelliJ IDEA编译运行,版本为2022.1。所用JDK版本为JDK11

    目录

    Stream流

    体验Stream流

    Stream流的使用

    Stream流的生成方式

    Stream流中间操作 filter

    Stream流中间操作 limit skip

    Stream流中间操作 concat distinct

    Stream流中间操作 sorted

    Stream流中间操作 map mapToInt

    Stream流终结操作 forEach count

    Stream流综合练习

    Stream流的收集操作


    Stream流

    体验Stream流

    Stream流把真正的函数式编程风格引入Java中。

    1. import java.util.ArrayList;
    2. public class stream1 {
    3. public static void main(String[] args){
    4. ArrayList list = new ArrayList();
    5. list.add("Hilda");
    6. list.add("Henri");
    7. list.add("Howard");
    8. list.add("Hermine");
    9. list.add("Hilary");
    10. list.add("Harvey");
    11. list.add("Hector");
    12. list.add("Helene");
    13. list.add("Henriette");
    14. list.add("Humberto");
    15. list.add("Hernan");
    16. list.add("Hanna");
    17. list.stream().filter((String s) ->{
    18. return (s.charAt(1) == 'e');
    19. }).filter((String s) -> {
    20. return s.length() ==6;
    21. }).forEach((String s) ->{
    22. System.out.println(s);
    23. });
    24. }
    25. }

    程序将列表中第二个字符是e,并且长度是6的字符串输出。程序的输出是:

    Hector
    Helene
    Hernan
     

    Stream流的使用

    生成流通过数据源(集合、数组等生成),如.stream()。

    一个流后面可以跟随多个中间操作,目的是打开流,做出某种程度的程序过滤/映射,然后返回一个新的流,交给下一个操作使用。如filter()。

    一个流只能有一个终结操作,执行后流就无法再操作,是流的最后一个操作,如forEach()。

    Stream流的生成方式

    Collection体系的集合可以使用默认方法stream()生成流。default Stream stream()

    Map体系的集合间接生成流。

    数组可以通过Stream接口的静态方法of(T...values)生成流。

    1. import java.util.HashMap;
    2. import java.util.List;
    3. import java.util.ArrayList;
    4. import java.util.stream.Stream;
    5. public class stream2 {
    6. public static void main(String[] args){
    7. List al = new ArrayList();
    8. Stream s1 = al.stream();
    9. Set hs = new HashSet();
    10. Stream s2 = hs.stream();
    11. Map hm = new HashMap();
    12. Stream s3 = hm.keySet().stream();
    13. Stream s4 = hm.values().stream();
    14. Stream> s5 = hm.entrySet().stream();
    15. String[] str = new String[]{"a","b","c","d"};
    16. Stream s6 = Stream.of(str);
    17. }
    18. }

    程序无输出。

    Stream流中间操作 filter

    Stream filter(Predicate predicate)对于流中的数据进行过滤。

    1. import java.util.ArrayList;
    2. public class streamfilter {
    3. public static void main(String[] args){
    4. ArrayList list = new ArrayList();
    5. list.add("Hilda");
    6. list.add("Henri");
    7. list.add("Howard");
    8. list.add("Hermine");
    9. list.add("Hilary");
    10. list.add("Harvey");
    11. list.add("Hector");
    12. list.add("Helene");
    13. list.add("Henriette");
    14. list.add("Humberto");
    15. list.add("Hernan");
    16. list.add("Hanna");
    17. list.stream().filter((String s) ->{
    18. return (s.charAt(1) == 'e');
    19. }).forEach((String s) ->{
    20. System.out.println(s);
    21. });
    22. System.out.println();
    23. list.stream().filter((String s) -> {
    24. return s.length() ==6;
    25. }).forEach((String s) ->{
    26. System.out.println(s);
    27. });
    28. }
    29. }

    程序的输出是:

    Henri
    Hermine
    Hector
    Helene
    Henriette
    Hernan

    Howard
    Hilary
    Harvey
    Hector
    Helene
    Hernan

    Stream流中间操作 limit skip

    Stream limit(long maxSize)返回此流中的元素组成的流,截取前给定参数个数的数据。

    Stream skip(long n)跳过指定参数个数的数据,返回由该流的剩余元素组成的流。

    1. import java.util.ArrayList;
    2. public class streamlimitskip {
    3. public static void main(String[] args){
    4. ArrayList list = new ArrayList();
    5. list.add("Hilda");
    6. list.add("Henri");
    7. list.add("Howard");
    8. list.add("Hermine");
    9. list.add("Hilary");
    10. list.add("Harvey");
    11. list.add("Hector");
    12. list.add("Helene");
    13. list.add("Henriette");
    14. list.add("Humberto");
    15. list.add("Hernan");
    16. list.add("Hanna");
    17. list.stream().limit(6).forEach((String s) ->{
    18. System.out.println(s);
    19. });
    20. System.out.println();
    21. list.stream().skip(6).forEach((String s) ->{
    22. System.out.println(s);
    23. });
    24. System.out.println();
    25. list.stream().skip(4).limit(4).forEach((String s) ->{
    26. System.out.println(s);
    27. });
    28. }
    29. }

    程序的输出是:

    Hilda
    Henri
    Howard
    Hermine
    Hilary
    Harvey

    Hector
    Helene
    Henriette
    Humberto
    Hernan
    Hanna

    Hilary
    Harvey
    Hector
    Helene

    Stream流中间操作 concat distinct

    static Stream concat(Stream a,Stream b)合并a和b两个流为一个流。

    Stream distinct()返回该流的不同元素(根据Object.equals(Object))组成的流。

    1. import java.util.ArrayList;
    2. import java.util.stream.Stream;
    3. public class streamconcatdistinct {
    4. public static void main(String[] args){
    5. ArrayList list = new ArrayList();
    6. list.add("Hilda");
    7. list.add("Henri");
    8. list.add("Howard");
    9. list.add("Hermine");
    10. list.add("Hilary");
    11. list.add("Harvey");
    12. list.add("Hector");
    13. list.add("Helene");
    14. list.add("Henriette");
    15. list.add("Humberto");
    16. list.add("Hernan");
    17. list.add("Hanna");
    18. Stream s1 = list.stream().limit(10);
    19. Stream s2 = list.stream().skip(2);
    20. Stream.concat(s1,s2).forEach((String s)->{
    21. System.out.print(s + " ");
    22. });
    23. System.out.println();
    24. }
    25. }

    程序的输出是:

    Hilda   Henri   Howard   Hermine   Hilary   Harvey   Hector   Helene   Henriette   Humberto   Howard   Hermine   Hilary   Harvey   Hector   Helene   Henriette   Humberto   Hernan   Hanna   
     

    1. import java.util.ArrayList;
    2. import java.util.stream.Stream;
    3. public class streamconcatdistinct {
    4. public static void main(String[] args){
    5. ArrayList list = new ArrayList();
    6. list.add("Hilda");
    7. list.add("Henri");
    8. list.add("Howard");
    9. list.add("Hermine");
    10. list.add("Hilary");
    11. list.add("Harvey");
    12. list.add("Hector");
    13. list.add("Helene");
    14. list.add("Henriette");
    15. list.add("Humberto");
    16. list.add("Hernan");
    17. list.add("Hanna");
    18. Stream s1 = list.stream().limit(10);
    19. Stream s2 = list.stream().skip(2);
    20. Stream.concat(s1,s2).distinct().forEach((String s)->{
    21. System.out.print(s + " ");
    22. });
    23. System.out.println();
    24. }
    25. }

    程序的输出是:

    Hilda   Henri   Howard   Hermine   Hilary   Harvey   Hector   Helene   Henriette   Humberto   Hernan   Hanna   
     

    Stream流中间操作 sorted

    Stream sorted()返回此流的元素组成的流,根据自然排序排序。

    Stream sorted(Comparator comparator)返回此流的元素组成的流,根据提供的comparator排序。

    1. import java.util.ArrayList;
    2. import java.util.Comparator;
    3. public class streamsort {
    4. public static void main(String[] args){
    5. ArrayList list = new ArrayList();
    6. list.add("Hilda");
    7. list.add("Henri");
    8. list.add("Howard");
    9. list.add("Hermine");
    10. list.add("Hilary");
    11. list.add("Harvey");
    12. list.add("Hector");
    13. list.add("Helene");
    14. list.add("Henriette");
    15. list.add("Humberto");
    16. list.add("Hernan");
    17. list.add("Hanna");
    18. list.stream().sorted().forEach((String s) ->{
    19. System.out.print(s + " ");
    20. });
    21. System.out.println();
    22. list.stream().sorted(new Comparator() {
    23. public int compare(String s1,String s2){
    24. return s1.length() - s2.length();
    25. }
    26. }).forEach((String s) ->{
    27. System.out.print(s + " ");
    28. });
    29. System.out.println();
    30. }
    31. }

    程序的输出是:

    Hanna   Harvey   Hector   Helene   Henri   Henriette   Hermine   Hernan   Hilary   Hilda   Howard   Humberto   
    Hilda   Henri   Hanna   Howard   Hilary   Harvey   Hector   Helene   Hernan   Hermine   Humberto   Henriette   

    Stream流中间操作 map mapToInt

    Stream map(Function mapper)返回给定函数应用于此流的元素的结果组成的流。

    IntStream mapToInt(ToIntFunction mapper)返回一个IntStream,其中包含将给定函数应用于此流的元素的结果。

    1. import java.util.ArrayList;
    2. public class streammapmaptoint {
    3. public static void main(String[] args){
    4. ArrayList list = new ArrayList();
    5. list.add("10");
    6. list.add("20");
    7. list.add("30");
    8. list.add("40");
    9. list.add("50");
    10. list.stream().map((String s) ->{
    11. return Integer.parseInt(s);
    12. }).forEach((Integer i) -> {
    13. System.out.println(i);
    14. });
    15. System.out.println();
    16. System.out.println(list.stream().mapToInt((String s) ->{
    17. return Integer.parseInt(s);
    18. }).sum());
    19. }
    20. }

    程序的输出是:

    10
    20
    30
    40
    50

    150

    Stream流终结操作 forEach count

    void forEach(Consumer action)对此流的每个元素执行操作。

    long count()返回此流的元素数。

    1. import java.util.ArrayList;
    2. public class streamforeachcount {
    3. public static void main(String[] args){
    4. ArrayList list = new ArrayList();
    5. list.add("Hilda");
    6. list.add("Henri");
    7. list.add("Howard");
    8. list.add("Hermine");
    9. list.add("Hilary");
    10. list.add("Harvey");
    11. list.add("Hector");
    12. list.add("Helene");
    13. list.add("Henriette");
    14. list.add("Humberto");
    15. list.add("Hernan");
    16. list.add("Hanna");
    17. list.stream().forEach((String s)->{
    18. System.out.println(s);
    19. });
    20. System.out.println(list.stream().count());
    21. }
    22. }

    程序的输出是:

    Hilda
    Henri
    Howard
    Hermine
    Hilary
    Harvey
    Hector
    Helene
    Henriette
    Humberto
    Hernan
    Hanna
    12
     

    Stream流综合练习

    1. public class actor {
    2. private String name;
    3. actor(){}
    4. actor(String name){
    5. this.name = name;
    6. }
    7. public void setname(String name){
    8. this.name = name;
    9. }
    10. public String getname(){
    11. return name;
    12. }
    13. }

    这是actor类,有成员变量name。 

    1. import java.util.ArrayList;
    2. import java.util.stream.Stream;
    3. public class streamtest {
    4. public static void main(String[] args){
    5. ArrayList manlist = new ArrayList();
    6. actor man1 = new actor("Peter");
    7. actor man2 = new actor("Philippe");
    8. actor man3 = new actor("Pablo");
    9. actor man4 = new actor("Paine");
    10. actor man5 = new actor("Paul");
    11. actor man6 = new actor("Polo");
    12. manlist.add(man1);
    13. manlist.add(man2);
    14. manlist.add(man3);
    15. manlist.add(man4);
    16. manlist.add(man5);
    17. manlist.add(man6);
    18. ArrayList womanlist = new ArrayList();
    19. actor woman1 = new actor("Paula");
    20. actor woman2 = new actor("Patty");
    21. actor woman3 = new actor("Paulette");
    22. actor woman4 = new actor("Pamela");
    23. actor woman5 = new actor("Pilar");
    24. actor woman6 = new actor("Priscilla");
    25. womanlist.add(woman1);
    26. womanlist.add(woman2);
    27. womanlist.add(woman3);
    28. womanlist.add(woman4);
    29. womanlist.add(woman5);
    30. womanlist.add(woman6);
    31. Stream man = manlist.stream().filter((actor act)->{
    32. return (act.getname().length() < 6);
    33. }).limit(4);
    34. Stream woman = womanlist.stream().filter((actor act)->{
    35. return (act.getname().length() < 9);
    36. }).skip(2);
    37. Stream people = Stream.concat(man,woman);
    38. people.forEach((actor act)->{
    39. System.out.println(act.getname());
    40. });
    41. }
    42. }

    程序创建了两个存储actor类对象的ArrayList集合,分别加入6个对象,随后按条件进行操作。

    程序的输出是:

    Peter
    Pablo
    Paine
    Paul
    Paulette
    Pamela
    Pilar

    Stream流的收集操作

    工具类Collectors提供了具体收集方式,把流中的数据收到集合中:

    public static Collector toList()将元素收集到List集合中。

    public static Collector toSet()将元素收集到Set集合中。

    public static Collector toMap(Function keyMapper,Function valueMapper)将元素收集到Map集合中。

    1. import java.util.ArrayList;
    2. import java.util.HashMap;
    3. import java.util.HashSet;
    4. import java.util.Set;
    5. import java.util.stream.Collectors;
    6. import java.util.stream.Stream;
    7. public class streamcollect {
    8. public static void main(String[] args){
    9. ArrayList strlist = new ArrayList();
    10. strlist.add("Pamela");
    11. strlist.add("Peter");
    12. strlist.add("Paine");
    13. strlist.add("Paula");
    14. strlist.add("Pilar");
    15. strlist.add("Philippe");
    16. strlist.add("Paul");
    17. strlist.add("Patty");
    18. strlist.add("Priscilla");
    19. strlist.add("Pablo");
    20. strlist.add("Polo");
    21. strlist.add("Paulette");
    22. Stream s1 = strlist.stream().filter((String s)->{
    23. return s.length() < 7;
    24. });
    25. ArrayList s1list = (ArrayList) s1.collect(Collectors.toList());
    26. for(String s:s1list){
    27. System.out.print(s + " ");
    28. }
    29. System.out.println();
    30. HashSet intset = new HashSet();
    31. intset.add(21);
    32. intset.add(19);
    33. intset.add(22);
    34. intset.add(16);
    35. intset.add(20);
    36. intset.add(23);
    37. Stream s2 = intset.stream().filter((Integer i) ->{
    38. return i > 18;
    39. });
    40. HashSet s2set = (HashSet) s2.collect(Collectors.toSet());
    41. for(Integer i:s2set){
    42. System.out.println(i + " ");
    43. }
    44. System.out.println();
    45. String[] strarr = new String[]{"Pamela,21","Peter,18","Paine,16","Paula,22","Pilar,15","Philippe,21",
    46. "Paul,20","Patty,20","Priscilla,19","Pablo,23","Polo,18","Paulette,22"};
    47. Stream s3 = Stream.of(strarr).filter((String s) ->{
    48. return Integer.parseInt(s.split(",")[1]) > 18;
    49. });
    50. HashMap s3map = (HashMap) s3.collect(Collectors.toMap((String s) ->{
    51. return s.split(",")[0];
    52. },(String s) ->{
    53. return Integer.parseInt(s.split(",")[1]);
    54. }));
    55. Set hs = s3map.keySet();
    56. for(String s:hs){
    57. System.out.println(s + s3map.get(s));
    58. }
    59. }
    60. }

    程序的输出是:

    Pamela   Peter   Paine   Paula   Pilar   Paul   Patty   Pablo   Polo   
    19   20   21   22   23   
    Pablo23
    Philippe21
    Pamela21
    Priscilla19
    Paulette22
    Paula22
    Paul20
    Patty20

  • 相关阅读:
    每一次只可跨1阶或2阶,爬100阶的楼梯可有多少种走法题解
    猿创征文|11个开发者必备工具,赶快收藏
    如果报华为网络工程师中级培训班一般学费多少?
    Git多人协作场景的使用
    hadoop_虚拟机linux环境部署全教程
    Java毕业设计 JSP+MySQL幼儿园信息管理系统
    django-haystack使用小结
    从Github登录的双因子验证到基于时间戳的一次性密码:2FA、OTP与TOTP
    Jupyter介绍和安装使用
    (附源码)ssm航空客运订票系统 毕业设计 141612
  • 原文地址:https://blog.csdn.net/m0_71007572/article/details/126468088