热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jdk8lamdba惰性求值2

上一篇:晓风轻:jdk8lambda的惰性求值​zhuanlan.zhihu.com我们知道jdk8的stream流方法里面,有中间方法和最终(终点终端)方法。只要不调用最终方法,

上一篇:

晓风轻:jdk8 lambda的惰性求值zhuanlan.zhihu.com《jdk8 lamdba 惰性求值2》

我们知道jdk8的stream流方法里面,有中间方法和最终(终点/终端)方法。只要不调用最终方法,中间所有的方法都不会实际执行。刚刚接触的时候,觉得这个效果好牛逼啊,学习了lambda之后想自己实现一下,想不到这么简单就实现了,就是不知道1. 官方是如何实现的,2. 是否有bug 3.是否有更加好的实现方法?? @李佳明

package jdk8.lazy;
import java.util.function.IntUnaryOperator;
import java.util.function.Supplier;
import java.util.stream.IntStream;
/** * 自己尝试实现方法惰性求值 * * @author 晓风轻 * @github https://github.com/xwjie/jdk8/blob/master/src/src/jdk8/lazy/LazyDemo2.java * @date 2018.3.8 * */
class MyClass {
private final int result;
public MyClass(int t) {
this.result = t;
}
public MyClass some(IntUnaryOperator f) {
return new MyClass(f.applyAsInt(this.result));
}
public int value() {
return this.result;
}
}
/** * 带惰性求值的类,不调用终点方法value的,中间的方法都不会执行 * */
class MyClassLazy {
private Supplier<Integer> resultSupplier;
public MyClassLazy(int t) {
this(() -> t);
}
public MyClassLazy(Supplier<Integer> t) {
this.resultSupplier = t;
}
/** * intermediate Method,中间方法 * * @param f * @return */
public MyClassLazy some(IntUnaryOperator f) {
return new MyClassLazy(() -> f.applyAsInt(this.resultSupplier.get()));
}
/** * terminal Method 结束方法 * @return */
public int value() {
return this.resultSupplier.get();
}
}
public class LazyDemo2 {
public static void main(String[] args) {
// map是中间函数,后面没有结束函数的时候不会调用 IntStream.range(0, 2).map(LazyDemo2::doubleNumber);
System.out.println("----------上面的日志不会打印------");
// 最后的map函数是结束函数的时候,中间的日志才会打印 IntStream.range(0, 2).map(LazyDemo2::doubleNumber).count();
System.out.println("\t------------测试普通的方法--------");
// 没有做惰性求值 testClass();
System.out.println("\n\t------------测试实现了惰性的方法--------");
// 实现了惰性求值 testLazyClass();
}
private static void testClass() {
MyClass c = new MyClass(10);
System.out.println("---------------------下面的日志我希望不需要打印的,但【实际上】打印了");
// 没有调用终点方法,期待中间的日志不打印 c.some(LazyDemo2::doubleNumber).some(LazyDemo2::doubleNumber);
System.out.println("---------------------");
// 执行中间方法 int value = c.some(LazyDemo2::doubleNumber).some(LazyDemo2::doubleNumber).value();
System.out.println("计算结果:" + value);
}
private static void testLazyClass() {
MyClassLazy c = new MyClassLazy(10);
System.out.println("---------------------下面的日志由于没有调用终点方法,【没有】打印");
// 没有调用终点方法,期待中间的日志不打印 c.some(LazyDemo2::doubleNumber).some(LazyDemo2::doubleNumber);
System.out.println("---------------------");
// 执行中间方法 int value = c.some(LazyDemo2::doubleNumber).some(LazyDemo2::doubleNumber).value();
System.out.println("计算结果:" + value);
}
static int doubleNumber(int i) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("乘以2");
return i * 2;
}
}

GitHub:

https://github.com/xwjie/jdk8/blob/master/src/src/jdk8/lazy/LazyDemo2.java


推荐阅读
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • Java 初次编程练习
    任务要求:设计一个类,包含若干基本属性和至少两个方法(可以从日常生活场景中提取)。在类中实现两个具有不同参数的构造方法。另外,设计一个包含 main 方法的类,用于测试和应用上述类。此作业需编写并调试通过。 ... [详细]
  • 可参照github代码:https:github.comrabbitmqrabbitmq-tutorialsblobmasterjavaEmitLogTopic.ja ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 本文介绍了如何在Spring框架中使用AspectJ实现AOP编程,重点讲解了通过注解配置切面的方法,包括方法执行前和方法执行后的增强处理。阅读本文前,请确保已安装并配置好AspectJ。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文详细介绍了Go语言中的数组,包括其基本概念、声明方式、初始化方法以及常见操作。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • Java 中的等时日期(int,int)方法,示例 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
author-avatar
迷人的哈喽柯柯_458
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有