本人目前大三在读,为了明年的实习,开始记录学习Java后端的内容,目前具有一定的java基础,在跟随黑马进行Javaweb课程的学习。因为之前java基础跟的是阿玮,跳着看的,所以现在补一补……
首先,stream流结合了Lambda表达式,去进行简化集合、数组的操作。
例如下面这一句,就使用到了stream流
list1.stream().filter(name->name.startsWith("张")).filter(name -> name.length() == 3).forEach(name -> System.out.println(name))
其目的是过滤出list1中名字开头为张且长度为三的名字内容,并对其进行打印,而我们如果正常编写代码的情况如下所示
//1.把所有以“张”开头的存储到新集合中
ArrayList<String> list2 = new ArrayList<>();
for (String name : list1) {
if (name.startsWith("张")){
list2.add(name);
}
}
//System.out.println(list2);
//2.把张开头的,长度为3的元素在存储到新集合中
ArrayList<String> list3 = new ArrayList<>();
for (String name : list2) {
if (name.length() == 3){
list3.add(name);
}
}
for (String name : list3) {
System.out.println(name);
}
代码量繁琐且复杂,对比stream流,我们可以很好地简化代码。
接下来,介绍一下stream流的使用步骤
1.先得到一条Stream流(流水线),并把数据放上去。
2.利用Stream流中的API进行各种操作(如中间方法:过滤、转换;终结方法:统计、打印等)
2.1使用中间方法对流水线上的数据进行操作
2.2使用终结方法对流水线上的数据进行操作
现在我们分别对这些步骤进行学习
1.如何获取一条流水线并把数据放上去
单列集合获取一条stream流
public class StreamDemo2 {
public static void main(String[] args) {
//1.单列集合获取stream流
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"a","b","c","d","e","f");
/*//获取到一条流水线,并把集合中的数据放到流水线上
Stream<String> stream1 =list.stream();
//使用终结方法打印一下流水线上的所有数据
stream1.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
//s:依次表示流水线上的每一个数据
System.out.println(s);
}
});*/
// 最终代码
list.stream().forEach(s -> System.out.println(s));
}
}
双列集合获取stream流(两种方式)
public class StreamDemo3 {
public static void main(String[] args) {
//双列集合不能直接使用stream流,你需要用单列集合去转换
//1.创建双列集合 哈希表不能保证存和取的顺序
HashMap<String,Integer> hm = new HashMap<>();
//2.添加数据
hm.put("aaa",111);
hm.put("bbb",222);
hm.put("ccc",333);
hm.put("ddd",444);
hm.put("eee",555);
//3.获取stream流 keyset获得的是键
// hm.keySet().stream().forEach(s -> System.out.println(s));
//4.第二种获取stream流 enterySet获得的是键值对
hm.entrySet().stream().forEach(s -> System.out.println(s));
}
}
数组获取Stream流
public class StreamDemo4 {
public static void main(String[] args) {
//数组获取Stream流
//1,创建数组
int [] arr1 = {1,2,3,4,5,6,7,8,9,10};
String[] arr2 = {"a","b","c"};
//2.获取Stream流
Arrays.stream(arr1).forEach(s -> System.out.println(s));
System.out.println("=============================");
Arrays.stream(arr2).forEach(s -> System.out.println(s));
}
}
如果数组是基本数据类型调用的是下面2,3,4三种方法
如果数组是引用数据类型调用的是第一种带有泛型的引用数据方法
最后一种就是零散数据的stream流了
public class StreamDemo5 {
public static void main(String[] args) {
//一堆零散数据 public static<T> Stream<T> of(T...values) Stream接口中的静态方法
Stream.of(1,2,4,3,3,4,6).forEach(s -> System.out.println(s));
System.out.println("===========================================");
Stream.of("a","b","c","d","e","f","g").forEach(s -> System.out.println(s));
}
}
注意:Stream流接口中静态方法of的细节
方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream流中。
以上内容全整理于黑马阿玮的java(stream流课程中),如有问题,还请大佬们多多指正!