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);
}
}
|
|