Java8 lambda表达式
阅读数:136 评论数:0
跳转到新版页面分类
python/Java
正文
一、概述
1、lambda允许把函数作为一个方法的参数。
二、取代某些匿名内部类
1、无参数函数的简写
如果需要创建一个线程,一种常见的写法是这样:
// JDK7 匿名内部类写法
new Thread(new Runnable(){// 接口名
@Override
public void run(){// 方法名
System.out.println("Thread run()");
}
}).start();
这是JDK7以及之前的常见写法,匿名内部类省去了起名字的烦恼,但还不够简化,在Java8中可以简化如下形式:
// JDK8 Lambda表达式写法
new Thread(
() -> System.out.println("Thread run()")// 省略接口名和方法名
).start();
这里连接口名和函数名都一同省掉了,如果函数体有多行,可以用大括号
// JDK8 Lambda表达式代码块写法
new Thread(
() -> {
System.out.print("Hello");
System.out.println(" Hoolee");
}
).start();
2、带参数函数的简写
// JDK8 Lambda表达式写法
List<String> list = Arrays.asList("I", "love", "you", "too");
Collections.sort(list, (s1, s2) ->{// 省略参数表的类型
if(s1 == null)
return -1;
if(s2 == null)
return 1;
return s1.length()-s2.length();
});
代码中参数表的类型也省略了,这得益于javac的类型推断机制,当然也可以手动指明参数类型。
三、自定义函数接口
自定义函数接口很容易,只需要编写一个只有一个抽象方法的接口即可。
// 自定义函数接口
@FunctionalInterface
public interface ConsumerInterface<T>{
void accept(T t);
}
@FunctionalInterface是可选的,但加上该标注编译器会帮你检查接口是否符合函数接口规范。
有了上述接口定义,就可以出类似如下的代码:
ConsumerInterface<String> consumer = str -> System.out.println(str);
consumer.accept("你好");
进一步的,还可以这样使用:
class MyStream<T>{
private List<T> list;
...
public void myForEach(ConsumerInterface<T> consumer){// 1
for(T t : list){
consumer.accept(t);
}
}
}
MyStream<String> stream = new MyStream<String>();
stream.myForEach(str -> System.out.println(str));// 使用自定义函数接口书写Lambda表达式
相关推荐
作用:使代码更简洁。
有些情况下,我们用lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,而通过方法引用可以使代码更简洁、更容易理解。
类型
语法
对应的L
一、概述
如果没有终端操作,中间操作是不会得到执行的(惰性求值)。
stream的使用可以将代码中大量的for循环变为简单的链式函数操作,但是需要注意性能,在数据量小的情况下二都相差不多,但是在数据
在JAVA5已经提供了Future和Callable的实现,可以用于阻塞式获取结果,如果想要异步获取结果,通常都会以轮询的方式去获取结果,如下:
<pre class="language
Supplier接口是JAVA8以后配合lambda表达式和函数式接口编程(FunctionInterface,以下简称FI)组合使用的一个接口。它最适合于表示工厂,简而言之,Supplier&
一、函数式编程和非函数编程的区别
(1)函数式编程:先考虑传入的参数,再考虑方法的实现。
(2)非函数编程:先定义好方法,再传入指定的参数
二、何为函数式接口
函数式接口(Functional Int
一、Java8简介
1、添加了函数式编程、Stream、全新的日期处理类。
2、函数编程新加了一些概念:lambda表达式、函数式接口、函数引用、默认方法、Optional类(干掉空指针)等。
3、S
一、概述
Java8引入了@Contented这个新的注解来减少伪共享(False Sharing)的发生。
二、伪共享
1、缓存行
CPU读取内存数据时并非一次只读一个字节,而是会读一段64字节长度
一、概述
Collectors是java.util.stream包下的一个工具类,其中各个方法的返回值可以作为java.util.stream.Stream#collect的入参,实现对队列的各种操作