过去我们在遍历一个数组的时候,使用的是循环的方式,但是,仔细想想,我们我们为什么一定要用for 循环,或者是while循环呢?我们的目的是得到数组中的某些,或者全部内容,而我们是通过for循环的方式去获取的,换言之,for循环只是过程,他并不是必须的,我们只需要得到结果,中间的过程我们可以不在乎。因此,便出现了Java Stream的方式,它是类似于生产线,流的方式去处理。
Stream 是1.8 加入的常用接口,不是函数式接口
代码:
public class Stream_huoqu {
public static void main(String[] args) {
List list = new ArrayList<>();
Stream stream1 = list.stream();
Set set = new HashSet<>();
Stream stream2 = set.stream();
//map,我们可以通过间接的方式,将其转化为Stream流
//转换键
Map map = new HashMap();
Set keySet = map.keySet();
Stream stream3 = keySet.stream();
//转换值
Collection values = map.values();
Stream stream4 = values.stream();
//转换键值对
Set> entries = map.entrySet();
Stream> stream5 = entries.stream();
//把数组转换为Stream
Stream stream6 = Stream.of(1,2,3,4,5,6);
Integer[] arr ={1,2,3,4,5,6};
Stream stream7 = Stream.of(arr);
String[] arr2 = {"a","b","c","d","e"};
Stream stream8 = Stream.of(arr2);
}
}
1)foreach 方法
是一个终结方法
2)filter方法
专递的是Predicate 函数接口,是一个判断的接口 这个接口中,有抽象方法test(T t) 主要用来判断,过滤。
3) map 方法
映射方法,中传的是Function 接口,使用map方法把字符串类型的数据,映射为Integer的数据
4)limit方法
是一个延时方法,返回一个新的流
5)skip 方法
跳过前几个数据
6)concat方法
组合方法,可以把两个流 合并成为一个流,是一个静态方法
代码:
import java.util.ArrayList;
import java.util.stream.Stream;
/*
* 用来遍历流中的数据
* foreach 是一个终结方法
*
* foreach(consumer)
* */
public class Stream_foreach {
public static void main(String[] args) {
//foreach 方法 终结方法, 使用之后,就不能使用其他流方法
//因为传的接口是consumer 接口,而stream流,是管道流,只能消费一次,
//所以消费一次之后,不能在进行第二次消费。
Stream stream = Stream.of("张三", "李四", "王五","张无忌","周芷若");
// stream.forEach(s-> System.out.println(s));
//Predicate 函数接口,是一个判断的接口
//其中有抽象方法test(T t)
Stream stream1 = stream.filter(s->s.startsWith("张"));
stream1.forEach(s-> System.out.println(s));
//map 方法,映射方法
//其中传的是Function 接口
//使用map方法把字符串类型的数据,映射为Integer的数据
System.out.println("===================================");
Stream stream2 = Stream.of("1", "2", "3", "4", "5");
Stream stream3 = stream2.map(s->Integer.parseInt(s));
stream3.forEach(s-> System.out.println(s));
System.out.println("=================");
//count方法 用于统计流中元素的个数
//Long count 是一个终结方法
ArrayList list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
Stream stream4 = list.stream();
long count1 = stream4.count();
System.out.println(count1
);
// limit方法 是一个延时方法,返回一个新的流
String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼"};
Stream stream5 = Stream.of(arr);
Stream stream6 = stream5.limit(3);//截取前三个数据
stream6.forEach(s-> System.out.println(s));
System.out.println("===========================");
//skip 方法,跳过前几个方法
Stream stream7 = Stream.of(arr);
Stream stream8 = stream7.skip(3);
stream8.forEach(s-> System.out.println(s));
//组合方法 concat 可以把两个流 合并成为一个流,是一个静态方法
String[] arr2 = {"美羊羊","喜洋洋","懒洋洋","灰太狼"};
Stream stream10 = Stream.of(arr);
Stream stream9 = Stream.of("张三", "李四", "王五","张无忌","周芷若");
Stream con = Stream.concat(stream10,stream9);
con.forEach(s-> System.out.println(s));
}
}
输出姓张的并且名字长度是3的人的名字
代码:
import java.util.ArrayList;
import java.util.List;
public class Stram_List_gaishu {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张量");
list.add("张三丰");
list.stream().filter(s->s.startsWith("张"))
.filter(s->s.length()==3)
.forEach(s-> System.out.println(s));
}
}
第一组数据,找出名字长度为3的前三个和第二组数据姓张的人的非前两个数据组合,并且用这些姓名产生一个新Person对象,输出最后的Person信息。
代码
主类
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Stream_jihe {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("迪丽热巴");
list.add("赵敏");
list.add("张三");
list.add("李四");
list.add("二狗");
list.add("王二麻子");
list.add("周芷若");
Stream stream = list.stream();
Stream stream1 = stream.filter(s->s.length()==3).limit(3);
// stream1.forEach(s-> System.out.println(s));
List list1 = new ArrayList<>();
list1.add("张三");
list1.add("王五");
list1.add("建国");
list1.add("国安");
list1.add("张四");
list1.add("张无忌");
list1.add("张三丰");
Stream stream2 = list1.stream();
Stream stream3 = stream2.filter(s->s.startsWith("张")).skip(2);
// stream3.forEach(s-> System.out.println(s));
Stream.concat(stream1,stream3).map(s->new Person(s)).forEach(s-> System.out.println(s));
}
}
Person类:
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}