黑马程序员技术交流社区

标题: 【成都校区】 Java的Stream流编程 [打印本页]

作者: 小刀葛小伦    时间: 2020-3-20 14:38
标题: 【成都校区】 Java的Stream流编程
1、stream流的介绍
  Java 8新增了Lambda表达式,于是也带来了函数式接口。同时,还带来了一种简化编程的stream流式编程。一定要清楚,stream流和IO stream流 一!点!关!系!都!没!有!

2、stream流的引入
  可以用工厂的流水线生产来比喻stream流编程,一般一个产品需要多步加工操作,通过流水线可以大大提高生产效率。同理,使用stream流进行编程,可以大大简化我们的开发难度。下面以一段简单的代码进行演示。

案例:找出列表中姓夏侯且姓名长度为3的名字

2.1、传统方式实现:
import java.util.ArrayList;
/**
* @author RuiMing Lin
* @date 2020-03-19 12:22
*/
public class Demo1 {
    public static void main(String[] args) {
        // 1.定义一个列表
        ArrayList<String> list = new ArrayList<>();
        list.add("刘备");
        list.add("关羽");
        list.add("张飞");
        list.add("诸葛亮");
        list.add("夏侯惇");
        list.add("夏侯渊");
        list.add("夏侯嘉正");
        // 2.挑选姓夏侯的
        ArrayList<String> list1 = new ArrayList<>();
        for (String s : list) {
            if (s.startsWith("夏侯")){
                list1.add(s);
            }
        }
        // 3.挑选名字长度为3的
        ArrayList<String> list2 = new ArrayList<>();
        for (String s : list1) {
            if (s.length() == 3){
                list2.add(s);
            }
        }
        // 4、遍历
        for (String s : list2) {
            System.out.println("s = " + s);
        }
    }
}

2.2、stream流实现:
import java.util.ArrayList;
/**
* @author RuiMing Lin
* @date 2020-03-19 12:22
*/
public class Demo1 {
    public static void main(String[] args) {
        // 1.定义一个列表
        ArrayList<String> list = new ArrayList<>();
        list.add("刘备");
        list.add("关羽");
        list.add("张飞");
        list.add("诸葛亮");
        list.add("夏侯惇");
        list.add("夏侯渊");
        list.add("夏侯嘉正");

        list.stream()
                .filter((name) -> { return name.startsWith("夏侯"); })
                .filter((name) -> { return name.length() == 3;})
                .forEach((name) -> {
                    System.out.println("name = " + name);
                });
    }
}

3、stream流的常用API
3.1、stream流的获取
  获取stream流有两种方式:一种是单列集合(Collection体系的类)均有一个stream(),另一种则是使用Stream类的静态方法of()可以获取。

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.stream.Stream;

/**
* @author RuiMing Lin
* @date 2020-03-19 13:42
*/
public class Demo2 {
    public static void main(String[] args) {
        // 所以单列集合均有stream方法
        ArrayList<String> list = new ArrayList<>();
        Stream<String> stream = list.stream();

        LinkedHashSet<String> set = new LinkedHashSet<>();
        Stream<String> stream1 = set.stream();

        // 使用Stream类的静态方法of()
        Stream<ArrayList<String>> stream2 = Stream.of(list);        // 传入一个集合
        Stream<Integer> stream3 = Stream.of(11, 22, 33, 44, 55);    // 传入可变参数
    }
}

3.2、forEach()
  forEach()是遍历流中的对象的,参数是一个Consumer函数式接口。不仅是本方法中使用的Consumer接口,还有下面方法使用的Predicate接口、Function接口,均是JDK内置的函数式接口。不了解的可以查看上一篇博客:Java的函数式接口

import java.util.ArrayList;
import java.util.stream.Stream;

/**
* @author RuiMing Lin
* @date 2020-03-19 13:47
*/
public class Demo3 {
    public static void main(String[] args) {
        // 1.定义一个列表
        ArrayList<String> list = new ArrayList<>();
        list.add("刘备");
        list.add("关羽");
        list.add("张飞");
        list.add("诸葛亮");
        list.add("夏侯惇");
        list.add("夏侯渊");
        list.add("夏侯嘉正");
        // 2.使用foreach
        Stream<String> stream = list.stream();
        stream.forEach((String name) -> {
            System.out.println("name = " + name);
        });
    }
}

3.3、filter()
  filter()是对流中的对象进行过滤的,参数是一个Predicate接口。

import java.util.ArrayList;
import java.util.stream.Stream;

/**
* @author RuiMing Lin
* @date 2020-03-19 13:47
*/
public class Demo3 {
    public static void main(String[] args) {
        // 1.定义一个列表
        ArrayList<String> list = new ArrayList<>();
        list.add("刘备");
        list.add("关羽");
        list.add("张飞");
        list.add("诸葛亮");
        list.add("夏侯惇");
        list.add("夏侯渊");
        list.add("夏侯嘉正");
        // 2.使用foreach进行遍历
        Stream<String> stream = list.stream();
        stream.forEach((String name) -> {
            System.out.println("name = " + name);
        });

        // 3.使用filter进行过滤
        stream.filter((String name) -> {
            return name.length() >= 3;
        });
    }
}

3.4、map()
  map()是对集合中的对象进行映射的,参数是一个Function接口,实现将对象从一种类型转化为另一种类型。

import java.util.stream.Stream;
/**
* @author RuiMing Lin
* @date 2020-03-19 13:56
*/
public class Demo4 {
    public static void main(String[] args) {
        String[] arr = {"11", "22", "33"};
        Stream<String> stream = Stream.of(arr);
        // 将每一个数字转化为字符串,并加上aaa
        stream.map(num -> {
            return Integer.parseInt(num);
        });
    }
}

3.5、count()
  count()是统计流中对象的方法,值得注意的是,使用count()后便不能再对流进行操作了。

import java.util.ArrayList;
import java.util.stream.Stream;

/**
* @author RuiMing Lin
* @date 2020-03-19 14:04
*/
public class Demo5 {
    public static void main(String[] args) {
        // 1.定义一个列表
        ArrayList<String> list = new ArrayList<>();
        list.add("刘备");
        list.add("关羽");
        list.add("张飞");
        list.add("诸葛亮");
        list.add("夏侯惇");
        list.add("夏侯渊");
        list.add("夏侯嘉正");

        // 2.使用count()
        Stream<String> stream = list.stream();
        long count = stream.count();
        System.out.println("count = " + count);

        // 3.尝试对流进行操作       结果:java.lang.IllegalStateException: stream has already been operated upon or closed
        // stream.forEach((name) -> {
        // System.out.println("name = " + name);
        // });
    }
}


3.6、limit()和skip()
  limit()是选取流对象前几个对象,而skip()刚好相反,它是跳过前几个对象。

3.7、concat()
  concat()实现对两个流进行合并:

import java.util.ArrayList;
import java.util.stream.Stream;

/**
* @author RuiMing Lin
* @date 2020-03-19 14:04
*/
public class Demo5 {
    public static void main(String[] args) {
        // 1.定义一个列表
        ArrayList<String> list = new ArrayList<>();
        list.add("刘备");
        list.add("关羽");
        list.add("张飞");
        list.add("诸葛亮");
        list.add("夏侯惇");
        list.add("夏侯渊");
        list.add("夏侯嘉正");

        // 2.再定义一个列表
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("刘备");
        list1.add("关羽");
        list1.add("张飞");
        list1.add("诸葛亮");
        list1.add("夏侯惇");
        list1.add("夏侯渊");
        list1.add("夏侯嘉正");

        // 3.获取流对象
        Stream<String> stream = list.stream();
        Stream<String> stream1 = list1.stream();
        // 4.合并流对象
        Stream<String> concat = Stream.concat(stream, stream1);
    }
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2