Lambda表达式
简介
lambda表达式是java SE 8中重要的新特性,允许通过表达式来代替功能接口。
功能接口即functional interface ,是只有一个显式声明的抽象方法的接口
@FunctionalInterface
public interface Runnable { void run(); }
lambda表达式可以为功能接口(函数式接口)赋值,也可以显式转型为一个Object
lambda表达式本身是什么类型?:由上下文推导而来即目标类型(Target type)
是一个被期待的类型。
例:
Runnable r1 = () -> {System.out.println("Hello Lambda!");};
Object obj = r1;
// ERROR! Object is not a functional interface!
Object obj = () -> {System.out.println("Hello Lambda!");};
// correct
Object o = (Runnable) () -> { System.out.println("hi"); };
使用:
//此处 不用显示声明,java可以根据上下文判断
Thread gaoDuanDaQiShangDangCi = new Thread( () -> {
System.out.println("This is from an anonymous method (lambda exp).");
} );
本质
本质是一个匿名方法
public int add(int x, int y) {
return x + y;
}
转换为lambda表达式:
(int x, int y) -> x + y;
// or
(x, y) -> x + y;
// or
(x, y) -> { return x + y; }
语法
(parameters)-> expression 或 (parameters) ->{statements;}
例:
//不需要参数,返回值是5
()->5
//接收一个参数,返回其两倍的值
(x)->2*x
//接收两个参数,并返回他们的差值
(x,y)->x-y
//接收两个int型整数,返回他们的和
(int x,int y)-> x+y
//接收一个String对象,并在控制台打印,不返回任何值(看起来像返回void)
(String s)->System.out.println(s)
使用中例子:
java8 Consumer
是一个预定义的函数式接口,可以
可以把lambda表达式实例化
Consumer<User> consumer = user1 ->user1.setName("11");
consumer.accept(user);
Stream
简介
Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包(函数式接口)以及 java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。
流是一个来自数据源的元素队列并支持聚合操作
数据源可以是集合,数组,I/O channel,generator等。
生成 流 : stream() 为集合创建串行流
parallelStream(),为集合创建并行流
例:
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
流还带来了很多函数如foreach,map,filter,limit,sorted
iterator
迭代器
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
while(iterator.hasNext()) {
//iterator.next()返回迭代的下一个元素
System.out.println(iterator.next());
}
番外 对foreach循环的理解
例:
public void test1() {
//定义并初始化一个数组
int arr[] = {2, 3, 1};
System.out.println("----1----排序前的一维数组");
for (int x : arr) {
System.out.println(x); //逐个输出数组元素的值
}
//对数组排序
Arrays.sort(arr);
//利用java新特性for each循环输出数组
System.out.println("----1----排序后的一维数组");
for (int x : arr) {
System.out.println(x); //逐个输出数组元素的值
}
}
优点:代码量减少 方便对容器进行遍历
缺点:没有索引 不能操作容器里面的元素。
引用:
1.https://blog.csdn.net/qq_32671287/article/details/79420736
2.https://www.runoob.com/java/java8-streams.html