Stream流学习

什么是流(Stream)

是数据渠道,用于数据操作数据源(数组集合等等)所生成的元素序列。

  • Stream 自己不会存储元素
  • Stream 不会改变源对象。
  • 操作延迟。

操作过程

● 创建Stream
一个数据源(集合、数组)获取一个流
● 中间操作
中间操作对数据进行处理(过滤等操作)
● 终止操作
产生结果的操作(如Sys.out.Prilntly)

创建流的几种方法

/**
* 创建流
*/
@Test
public void test01(){
    /**
    * 集合流
    *  - Collection.stream() 穿行流
    *  - Collection.parallelStream() 并行流
    */
    List<String> list = new ArrayList<>();
    Stream<String> stream1 = list.stream();

    //数组流
    //Arrays.stream(array)
    String[] strings = new String[10];
    Stream<String> stream2 = Arrays.stream(strings);

    //Stream 静态方法
    //Stream.of(...)
    Stream<Integer> stream3 = Stream.of(1, 2, 3);

    //无限流
    //迭代
    Stream<Integer> stream4 = Stream.iterate(0, (i) -> ++i+i++);
    stream4.forEach(System.out::println);

    //生成
    Stream.generate(() -> Math.random())
        .limit(5)
        .forEach(System.out::println);
}

中间操作

筛选

● filter:接收 Lambda ,从流中排除某些元素
● limit:截断流,使其元素不超过给定数量
● skip(n):跳过元素,返回一个舍弃了前n个元素的流;若流中元素不足n个,则返回一个空流;与 limit(n) 互补
● distinct:筛选,通过流所生成的 hashCode() 与 equals() 取除重复元素

映射

● map:接收 Lambda ,将元素转换为其他形式或提取信息;接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
● flatMap:接收一个函数作为参数,将流中每一个值都换成另一个流,然后把所有流重新连接成一个流

查找终止操作

● allMatch:检查是否匹配所有元素
● anyMatch:检查是否至少匹配一个元素
● noneMatch:检查是否没有匹配所有元素
● findFirst:返回第一个元素
● findAny:返回当前流中的任意元素
● count:返回流中元素的总个数
● max:返回流中最大值
● min:返回流中最小值

归约/收集操作

● 归约:reduce(T identity, BinaryOperator) / reduce(BinaryOperator) 可以将流中的数据反复结合起来,得到一个值。
● 收集:collect 将流转换成其他形式;接收一个 Collector 接口的实现,用于给流中元素做汇总的方法。

Stream练习

package com.zgf.Stream;

import com.zgf.Lamada.Test1.Employee;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @program: Java8New
 * @description:
 * @author: zhengguofeng
 * @create: 2020-10-14 21:09
 **/
public class Practice {

    @Test
    public void test1() {
        int aa[] = {1, 2, 3, 4, 5, 6};
        Arrays.stream(aa)
                .map(x -> x * x)
                .forEach(System.out::println);
    }

    List<Transation> transations = null;

    @Before
    public void chushihua() {
        Trader trader = new Trader("Adasdsa", "青岛");
        Trader trader1 = new Trader("Bdasdsad", "青岛");
        Trader trader2 = new Trader("Casdasd", "北京");
        Trader trader3 = new Trader("Edsadasd", "北京");
        Trader trader4 = new Trader("BSDASD", "上海");
        Trader trader5 = new Trader("asd", "上海");

        transations = Arrays.asList(new Transation(trader, 2011, 300),
                new Transation(trader1, 2010, 300),
                new Transation(trader2, 2012, 666),
                new Transation(trader3, 2013, 777),
                new Transation(trader4, 2012, 666),
                new Transation(trader5, 2011, 666)
        );
    }

    @Test
    public void test() {
        //1。找出2011年发生的所有交易,并按交易额排序(从低到高)
        System.out.println("-------------------找出2011年发生的所有交易,并按交易额排序(从低到高)--------------------------");
        transations.stream()
                .filter(x -> x.getYear() == 2011)
                .sorted((t, y) -> Integer.compare(t.getValue(), y.getValue()))
                .forEach(System.out::println);
        // 2.交易员都在哪些不同的城市工作过?
        System.out.println("---------------------交易员都在哪些不同的城市工作过?-------------------------");
        transations.stream()
                .map(x->x.getTrader().getCity())
                .distinct()
                .forEach(System.out::println);
        //3.查找所有来自剑桥的交易员,并按姓名排序
        System.out.println("---------------------查找所有来自青岛的交易员,并按姓名排序-------------------");
        transations.stream()
                .map(x->x.getTrader())
                .filter(y->y.getCity().equals("青岛"))
                .sorted((t1,t2)->t1.getName().compareTo(t2.getName()))
                .forEach(System.out::println);

        //4。返回所有交易员的姓名字符串,按字母顺序排序
        System.out.println("-------------------返回所有交易员的姓名字符串,按字母顺序排序-------------------");
        transations.stream()
                .map(t->t.getTrader().getName())
                .sorted()
                .forEach(System.out::println);

        String reduce = transations.stream()
                .map(t -> t.getTrader().getName())
                .sorted()
                .reduce("", (x, y) -> x + y);
        System.out.println(reduce);
        String collect = transations.stream()
                .map(t -> t.getTrader().getName())
                .sorted()
                .collect(Collectors.joining(","));
        System.out.println(collect);

        //5.有没有交易员是在米兰工作的?
        System.out.println("-------------------有没有交易员是在上海工作的?-------------------");
        boolean flag = transations.stream()
                .map(x -> x.getTrader())
                .anyMatch(x -> x.getCity().equals("上海"));
        System.out.println(flag);


        //6.打印生活在剑桥的交易员的所有交易额
        System.out.println("-------------------打印生活在北京的交易员的所有交易额-------------------");
        transations.stream()
                .filter(x -> x.getTrader().getCity().equals("北京"))
                .collect(Collectors.toList())
                .stream()
                .map(y->y.getValue())
                .forEach(System.out::println);
        //7。所有交易中,最高的交易额是多少
        System.out.println("-------------------所有交易中,最高的交易额是多少-------------------");
        Optional<Integer> max = transations.stream()
                .map(x -> x.getValue())
                .max(Integer::compare);
        System.out.println(max);
        //  8。找到交易额最小的交易
        System.out.println("-------------------找到交易额最小的交易-------------------");
 	 }
}

并行流 / 串行流

@Test
public void test03(){
    //串行流(单线程):切换为并行流 parallel()
    //并行流:切换为串行流 sequential()
    LongStream.rangeClosed(0, 100000000L)
        .parallel() //底层:ForkJoin
        .reduce(0, Long::sum);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值