J2SE 8的Lambda --- functions
functions
//1. Runnable 输入参数:无 返回类型void
new Thread(() -> System.out.println("In Java8!") ).start();
System.out.println();
//2.Predicate<T> 输入参数:t 返回类型boolean
List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
// case1, 用流fliter,再 foreach遍历,传入Predicate 判断boolean
System.out.println("Languages which starts with J :");
filter(languages, (str)->str.startsWith("J"));
System.out.println();
Predicate<String> jSatrtConditions =(str)->str.startsWith("J");
Predicate<String> aEndsConditions =(str)->str.endsWith("a");
//case2, 两个&&关系
filter(languages, jSatrtConditions.and(aEndsConditions));
System.out.println();
//case3, 两个||关系
filter(languages, jSatrtConditions.or(aEndsConditions));
System.out.println();
//case4, 调用Predicate的静态isEqual方法
Predicate<String> predicateEqual = Predicate.isEqual("Java");
System.out.println(predicateEqual.test("JAVA"));
Predicate<String> and = predicateEqual.and(jSatrtConditions);
filter(languages, and);
System.out.println();
//3.Function<T,R> 输入参数:T 返回类型R
List<Integer> numList = Arrays.asList(100, 200, 300, 400, 500);
filter2(numList, n->n+1);
System.out.println();
//4.BiFunction<T, U, R> 输入参数:T,U 返回类型R
BiFunction<String, String,String> biFunction = (x,y)->x+y;
System.out.println(biFunction.apply("111", "222"));
System.out.println(biFunction.andThen(n->n+"*").apply("111", "222"));
System.out.println();
//5.BinaryOperator<T,T,T> 输入参数:T,T 返回类型T
//Represents an operation upon two operands of the same type, producing a result of the same type as the operands
Integer filter3Result = filter3(numList, n->n+1, (x,y)->x+y);
System.out.println(filter3Result);
System.out.println();
//第一步,和identity做相加生产新的数组
//第二步,新的数组每两个相乘
List<Integer> numList2 = Arrays.asList(1, 2, 3, 4, 5);
Integer filter4Result = filter4(numList2, 1, (x,y)->{
return x+y;
}, (x,y)->{
return x*y;
});
System.out.println(filter4Result);
System.out.println();
//6.Optional
//值不存在的情况下产生可替代物
ArrayList<String> arrayList = new ArrayList<>();
//(1) 创建Optional
//1) Optional.of() 它要求传入的 obj 不能是 null 值的, 否则还没开始进入角色就倒在了 NullPointerException 异常上了
Optional<String> stringOptional = Optional.of("stringOptional");
System.out.println(stringOptional.orElse(null));
System.out.println();
//2) Optional.ofNullable(obj): 它以一种智能的, 宽容的方式来构造一个 Optional 实例. 来者不拒, 传 null 进到就得到 Optional.empty(), 非 null 就调用 Optional.of(obj)
stringOptional = Optional.ofNullable(null);
System.out.println(stringOptional.orElse(null));
System.out.println();
//3) Optional.empty() 空的Optional
Optional<Object> emptyOptional = Optional.empty();
System.out.println(emptyOptional.orElse(null));
System.out.println();
//4) 自己创建
Optional<Double> inverseOptional = inverse(1.2);
System.out.println(inverseOptional.orElse(null));
System.out.println();
//(2) orElse() 值不存在的情况下的默认物
Optional<String> ofNullableOptional = Optional.ofNullable(null);
System.out.println(ofNullableOptional.orElse("default value"));
ofNullableOptional = Optional.empty();
System.out.println(ofNullableOptional.orElse("default value"));
System.out.println();
//(3) orElseGet() 值不存在的情况下, 提供Supplier
ofNullableOptional = Optional.ofNullable(null);
System.out.println(ofNullableOptional.orElseGet(()->new Date().toString()));
ofNullableOptional = Optional.empty();
System.out.println(ofNullableOptional.orElseGet(()->new Date().toString()));
System.out.println();
//(4) orElseThrow() 值不存在的情况下, 提供Supplier异常
try {
ofNullableOptional = Optional.ofNullable(null);
System.out.println(ofNullableOptional.orElseThrow(Exception::new));
} catch (Exception e) {
System.out.println("orElseThrow");
e.printStackTrace();
}
System.out.println();
try {
ofNullableOptional = Optional.empty();
System.out.println(ofNullableOptional.orElseThrow(Exception::new));
} catch (Exception e) {
System.out.println("orElseThrow");
e.printStackTrace();
}
System.out.println();
//(5) isPresent() 是否存在
boolean present = Optional.of("stringOptional").isPresent();
System.out.println(present);
present = Optional.empty().isPresent();
System.out.println(present);
System.out.println();
//(6) ifPresent() 如果存在,将元素传递给对应函数(比如将其加入集合或者做计算)
Optional.of("stringOptional").ifPresent(e->System.out.println(e));
Optional.of("stringOptional").ifPresent(System.out::println);
Optional.of("stringOptional").ifPresent(e->arrayList.add(e));
Optional.empty().ifPresent(e->System.out.println("xxx"));
System.out.println();
//(7) map() 将对应的值传递给mapper
Optional.of("map").map(e->arrayList.add(e));
System.out.println(arrayList);
Optional<Boolean> mapOptional = Optional.ofNullable("mapOptional").map(arrayList::add);
System.out.println(arrayList);
mapOptional = Optional.of("map").map(e->arrayList.add(e));
System.out.println(mapOptional.orElse(null));
//(8) get() 得到对应的值, 如果值不存在, 抛出exception
System.out.println(Optional.of("map").get());
//java.util.NoSuchElementException: No value present
// System.out.println(Optional.ofNullable(null).get());
Optional<Object> ofNullable = Optional.ofNullable(null);
if(ofNullable.isPresent()){
System.out.println(ofNullable.get());
}
//(9) flatMap() 组合两个返回Optional的方法 f(), g()
//方式一: f().float(T::g)
Optional<Double> flatMapOptional = inverse(1.2).flatMap(LambdaFunctionsTest::square);
System.out.println(flatMapOptional.orElse(null));
System.out.println();
//方式二: .float(T::f).float(T::g) 还可以在后面再.float(T::g)
flatMapOptional = Optional.of(1.2).flatMap(LambdaFunctionsTest::inverse).flatMap(LambdaFunctionsTest::square);
System.out.println(flatMapOptional.orElse(null));
System.out.println();
辅助方法
public static <T> void filter(List<T> names, Predicate<T> conditions){
names.stream().filter(conditions).forEach(name->System.out.println(name));
}
public static <T,R> void filter2(List<T> names, Function<T,R> function){
names.stream().map(function).forEach(name->System.out.println(name));
}
public static <T,R> R filter3(List<T> names, Function<T,R> mapFunction, BinaryOperator<R> binaryOperatorFunction){
return names.stream().map(mapFunction).reduce(binaryOperatorFunction).get();
}
public static <T,U,R> U filter4(List<T> names, U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> binaryOperatorFunction){
return names.stream().parallel().reduce(identity, accumulator, binaryOperatorFunction);
}
public static Optional<Double> inverse(Double t){
return null==t||t.equals(0) ? Optional.empty():Optional.of(1/t);
}
public static Optional<Double> square(Double t){
return null==t||t.equals(0) ? Optional.empty():Optional.of(Math.sqrt(t));
}
J2SE 8的Lambda --- functions的更多相关文章
- C++闭包: Lambda Functions in C++11
表达式无疑是C++11最激动人心的特性之一!它会使你编写的代码变得更优雅.更快速! 它实现了C++11对于支持闭包的支持.首先我们先看一下什么叫做闭包 维基百科上,对于闭包的解释是: In progr ...
- Python: Lambda Functions
1. 作用 快速创建匿名单行最小函数,对数据进行简单处理, 常常与 map(), reduce(), filter() 联合使用. 2. 与一般函数的不同 >>> def f (x) ...
- J2SE 8的Lambda --- 语法
语法例子 LambdaGrammarTest lambdaTest = new LambdaGrammarTest(); // 1. 能够推导出类型的,可以不写类型 String[] planets ...
- J2SE 8的Lambda --- Comparator
Person[] personArray = new Person[]{new Person("Tom"),new Person("Jack"),new Per ...
- fn project AWS Lambda 格式 functions
Creating Lambda Functions Creating Lambda functions is not much different than using regular funct ...
- 在Android中使用Java 8的lambda表达式
作为一名Java开发者,或许你时常因为缺乏闭包而产生许多的困扰.幸运的是:Java's 8th version introduced lambda functions给我们带来了好消息;然而,这咩有什 ...
- Python中Lambda, filter, reduce and map 的区别
Lambda, filter, reduce and map Lambda Operator Some like it, others hate it and many are afraid of t ...
- Php5.3的lambda函数以及closure(闭包)
从php5.3以后,php也可以使用lambda function(可能你会觉得是匿名函数,的确是但不仅仅是)来写类似javascript风格的代码: $myFunc = function() { e ...
- Automated EBS Snapshots using AWS Lambda & CloudWatch
Overview In this post, we'll cover how to automate EBS snapshots for your AWS infrastructure using L ...
随机推荐
- Linux内核配置
1.autoconf.h文件 老版本的Linux内核中,执行make menuconfig后,编译系统会把所有的配置信息保存到源码顶层目录下的.config文件中,然后将.config中的内容转换为C ...
- gRPC-Web is going GA
原文: https://www.cncf.io/blog/2018/10/24/grpc-web-is-going-ga On behalf of the Cloud Native Computing ...
- 2014华为机试西安地区A组试题
2014华为机试西安地区A组试题 题目一.分苹果 M个同样苹果放到N个同样篮子里有多少种放法,同意有篮子不放. 1<=M<=10.1<=N<=10 比如5个苹果三个篮子,3,1 ...
- nyoj 某种序列
某种序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 数列A满足An = An-1 + An-2 + An-3, n >= 3 编写程序,给定A0, A1 ...
- 使用Apriori进行关联分析(二)
书接上文(使用Apriori进行关联分析(一)),介绍如何挖掘关联规则. 发现关联规则 我们的目标是通过频繁项集挖掘到隐藏的关联规则. 所谓关联规则,指通过某个元素集推导出另一个元素集.比如有一个频繁 ...
- xhan/qqbot试用
xhan/qqbot试用 啥是qqbot?基于WebQQ协议的QQ机器人.命令行工具,Hubot支持! 怎样安装?首先要安装CoffeeScript windows:安装nodejs:主页上就有下载C ...
- Sqoop之 Sqoop 1.4.6 安装
1. sqoop数据迁移 1.1 概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HI ...
- selenium常用获取元素点
//通过id WebElement element = driver.findElement(By.id("coolestWidgetEvah")); //通过className ...
- Oracle RAC的机制与测试方法
Oracle RAC的机制与测试方法 标签: rac 机制 测试 2016-05-25 09:54 1150人阅读 评论(0) 收藏 举报 分类: oracle(2) 1.RAC原理 Oracle ...
- Linux下Oracle中SqlPlus时上下左右键乱码问题的解决办法
window下的sqlplus可以通过箭头键,来回看历史命令,用起来非常的方便. 但是在Linux下,会出现各种乱码,非常不方便,如下图所示,每次打错一个字符就需要重新打一遍. 解决办法:rlwrap ...