Stream流
1.流stream:保存对集合或数组数据的操作,和集合类似,但集合中保存的是数据
1.1 特点:
stream 自己不会存储元素
stream 不会改变源对象,相反,会返回一个持有结果的新stream
stream 操作是延迟执行的,意味着他们会等到需要结果的时候才执行
1.2 步骤:
1.创建
新建一个流
2.中间操作
在一个或多个步骤中,将初始stream转化到另一个stream的中间操作
3.终止操作
使用一个终止操作来产生一个结果,该操作会强制它之前的延迟操作立即执行,之后,该stream就不能使用
1.3 获取stream对象的方式
通过collection对象的stream()或parallelStream()方法
通过Arrays类的stream()方法
通过Stream接口的of(),iterate(),generate()方法
通过Intstream,LongStream,DoubleStream接口中的of,range,rangeclosed方法
1.3.1 测试:
①、集合对象的stream和parallelStream
ArrayList<String> list = new ArrayList<>();
list.add("theShy");
list.add("MLXG");
list.add("XiaoHu");
list.add("Uzi");
list.add("Ming");
//1.集合流化后并遍历(串行流)
// list.stream().forEach(s -> System.out.println(s));
//2.集合流化后并遍历(并行流)
// list.parallelStream().forEach(s -> System.out.println(s));
//方法引用
// list.stream().forEach(System.out::println);
// list.parallelStream().forEach(System.out::println);
②、Arrays类的stream()方法
int[] arr={3,5,15,46,85,21,64};
//1.数组流化 通过Arrays类的stream方法
// Arrays.stream(arr).forEach(System.out::println);
③、通过Stream接口中的of(),iterate(),generate()方法
//of方式
// Stream<String> stream = Stream.of("U", "z", "i");
// stream.forEach(System.out::println);
//iterate方式
// UnaryOperator<Integer> unaryOperator =x->x+10;
// //seed :初始化元素
// Stream<Integer> iterate = Stream.iterate(0, unaryOperator);
// iterate.limit(10).forEach(System.out::println);
//generator方式
Supplier<Integer> i = ()->new Random().nextInt(100);
// Stream.generate(i).limit(5).forEach(System.out::println);
Stream.generate(()->new Random().nextInt(100)).limit(5).forEach(System.out::println);
④、通过Intstream,LongStream,DoubleStream接口中的of,range,rangeclosed方法
//startInclusive 初始值
//endInclusive 上限
// IntStream.rangeClosed(0,6).forEach(System.out::println);
//
// //startInclusive 初始值
// //endExclusive 上限
LongStream.rangeClosed(0,5).forEach(System.out::println);
//values: 传入元素制造新流
DoubleStream.of(1,2,3,4,5,6).forEach(System.out::println);
中间操作,终止操作
中间操作
filter:过滤
limit:限制、截取
skip:跳过
distinct:去掉重复
sorted:排序
map:映射、调用这个函数后,可以改变返回的类型
parallel:采用多线程
终止操作
forEach:stream API 使用内部迭代(默认做了外部迭代)
max:返回流中最大值
min :返回流中最小值
count :返回流中元素总数
findAny(): 返回当前流中的任意元素
findFirst(): 返回第一个元素
reduce 归约: 可以将流中元素反复结合起来,得到一个值。返回 Optional
collect 收集: 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
创建一个列表
public class Ganin {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("Tom",24,"美国",'M'));
list.add(new Person("Harley",22,"英国",'F'));
list.add(new Person("向天笑",20,"中国",'M'));
list.add(new Person("李康",22,"中国",'M'));
list.add(new Person("欧阳雪",18,"中国",'F'));
list.add(new Person("小梅",20,"中国",'F'));
list.add(new Person("何雪",21,"中国",'F'));
list.add(new Person("李康",22,"中国",'M'));
//找到年龄大于20岁的人并输出 filter forEach
// list.stream().filter((t)->t.getAge()>20).forEach(System.out::println);
//找出所有中国人的数量 filter count
//System.out.println(list.stream().filter(t -> t.getCountry().equals("中国")).count());
//从Person列表中取出两个女性 filter limit
//list.stream().filter(t->t.getSex()=='F').limit(2).forEach(System.out::println);
//从Person列表中从第2个女性开始,取出所有的女性
//list.stream().filter(t->t.getSex()=='F').skip(1).forEach(System.out::println);
//distinct 去重
//list.stream().distinct().forEach(System.out::println);
//sorted 排序 按年龄排序,年龄相同则按姓名排序
//list.stream().sorted((o,t)->o.getAge()==t.getAge()?o.getName().compareTo(t.getName()):o.getAge().compareTo(t.getAge())).forEach(System.out::println);
//map 映射 得到信息
list.stream().map(person -> person.getName()+":"+person.getCountry()).forEach(System.out::println);
//max 条件年龄最大的
Person person = list.stream().max((Person o, Person t) -> o.getAge().compareTo(t.getAge())).get();
System.out.println(person);
}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
class Person{
private String name;
private Integer age;
private String country;
private char sex;
}
版权声明:本文为weixin_54517901原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。