第6篇 stream ---数值流

**
 * Java 8引入了三个原始类型特化流接口来解决这个问题:IntStream、DoubleStream和
 * LongStream,分别将流中的元素特化为int、long和double,从而避免了暗含的装箱成本。每
 * 个接口都带来了进行常用数值归约的新方法,比如对数值流求和的sum,找到最大元素的max。
 * 此外还有在必要时再把它们转换回对象流的方法。要记住的是,这些特化的原因并不在于流的复
 * 杂性,而是装箱造成的复杂性——即类似int和Integer之间的效率差异
 */
public class PrimitiveTypeDemo {
    public static void main(String[] args) {
        List<Dish> menues = Arrays.asList(new Dish("rice", true, 10000, Dish.Type.FISH), new Dish("meat", false, 20000, Dish.Type.FISH), new Dish("dog", true, 30000, Dish.Type.FISH));
        test01(menues);
    }

    /**
     * 1. 映射到数值流:
     * 将流转换为特化版本的常用方法是mapToInt、mapToDouble和mapToLong。这些方法和前
     * 面说的map方法的工作方式一样,只是它们返回的是一个特化流,而不是Stream<T>。例如,你
     * 可以像下面这样用mapToInt对menu中的卡路里求和:
     * 这里,mapToInt会从每道菜中提取热量(用一个Integer表示),并返回一个IntStream
     * (而不是一个Stream<Integer>)。然后你就可以调用IntStream接口中定义的sum方法,对卡
     * 路里求和了!请注意,如果流是空的,sum默认返回0。IntStream还支持其他的方便方法,如
     * max、min、average等。
     */
    public static void test01(List<Dish> menues) {
        int sum = menues.stream().mapToInt(Dish::getCalories).sum();
        System.out.println(sum);
    }

    /**
     *  转换回对象流:
     *  同样,一旦有了数值流,你可能会想把它转换回非特化流。例如,IntStream上的操作只能
     * 产生原始整数: IntStream 的 map 操作接受的 Lambda 必须接受 int 并返回 int (一个
     * IntUnaryOperator)。但是你可能想要生成另一类值,比如Dish。为此,你需要访问Stream
     * 接口中定义的那些更广义的操作。要把原始流转换成一般流(每个int都会装箱成一个
     * Integer),可以使用boxed方法,如下所示:
     * @param menues
     */

    public static void test02(List<Dish> menues) {
        IntStream intStream = menues.stream().mapToInt(Dish::getCalories);
        Stream<Integer> boxed = intStream.boxed();

    }

    /**
     * 默认值OptionalInt:
     * 求和的那个例子很容易,因为它有一个默认值:0。但是,如果你要计算IntStream中的最
     * 大元素,就得换个法子了,因为0是错误的结果。如何区分没有元素的流和最大值真的是0的流呢?
     * 前面我们介绍了Optional类,这是一个可以表示值存在或不存在的容器。Optional可以用
     * Integer、String等参考类型来参数化。对于三种原始流特化,也分别有一个Optional原始类
     * 型特化版本:OptionalInt、OptionalDouble和OptionalLong;
     * 例如,要找到IntStream中的最大元素,可以调用max方法,它会返回一个OptionalInt:
     * @param menues
     */
    public static void test03(List<Dish> menues) {
        OptionalInt max = menues.stream().mapToInt(Dish::getCalories).max();
        if(max.isPresent()){
            System.out.println("有最大值"+max.getAsInt());
        }else{
            int defaultValue = max.orElse(1);
            System.out.println("没有最大值,采用默认的最大值"+defaultValue);
        }
    }

}

git hub 地址:https://github.com/wangrui0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值