Java Lambda使用示例
下文笔者讲述java中Lambda使用示例简介说明,如下所示
Lambda简介
Lambda表达式: 是JDK 8中定义的一种新的语法 Lambda的功能: 简化匿名内部类的代码写法 Lambda的语法 (匿名内部类被重写方法的形参列表) -> { 重写方法 } 注意事项: Lambda表达式只能简化函数式接口的 匿名内部类的写法形式
函数式接口简介
接口中有且仅有一个抽象方法的形式 通常会在接口上加上一个@FunctionalInterface注解 标记该接口必须是满足函数式接口例:
定义一个user类
class user {
public int age;
public char sex;
public double socre;
public user(int age, char sex, double score) {
this.age = age;
this.sex = sex;
this.score = score;
}
}
lambda实现list按照年龄排序
实现排序的功能 可直接调用List对象自带的sort方法完成 此时user需先实现Comparator的接口并重写compare方法,这种方式需修改类 下文笔者演示使用Lambda传入一个比较器的方式实现 sort(Comparator<? super E> c) 方法 可直接传入一个Comparator对象例
public class lambdaTry {
public static void main(String[] args) {
List<user> userlist = new ArrayList<>();
userlist.add(new user(19, '猫猫', 98.0));
userlist.add(new user(18, '狗狗', 95.0));
userlist.add(new user(20, '牛牛', 96.0));
userlist.add(new user(17, '小琪', 97.0));
userlist.sort(new Comparator<user>() {
@Override
public int compare(user o1, user o2) {
return o1.age - o2.age;
}
});
}
}
使用Lambda简化比较器
@FunctionalInterface注解
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
...
}
public class lambdaTry {
public static void main(String[] args) {
List<user> userlist = new ArrayList<>();
userlist.add(new user(19, '猫猫', 98.0));
userlist.add(new user(18, '狗狗', 95.0));
userlist.add(new user(20, '牛牛', 96.0));
userlist.add(new user(17, '小琪', 97.0));
userlist.sort((user o1, user o2) -> {
return o1.age - o2.age;
});
}
}
Lambda简写
public class lambdaTry {
public static void main(String[] args) {
List<user> userlist = new ArrayList<>();
userlist.add(new user(19, '猫猫', 98.0));
userlist.add(new user(18, '狗狗', 95.0));
userlist.add(new user(20, '牛牛', 96.0));
userlist.add(new user(17, '小琪', 97.0));
userlist.sort((o1, o2) -> o1.age - o2.age);
}
}
Lambda之List转换为数组
JDK11之后
提供toArray方法实现list转数组
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
IntFunction函数式接口是从JDK8之后实现的
内部只有一个apply抽象方法,是一个标准的函数式接口
@FunctionalInterface
public interface IntFunction<R> {
R apply(int value);
}
可直接使用lambda
完成数组转换
public class lambdaTry {
public static void main(String[] args) {
List<user> userlist = new ArrayList<>();
userlist.add(new user(19, '猫猫', 98.0));
userlist.add(new user(18, '狗狗', 95.0));
userlist.add(new user(20, '牛牛', 96.0));
userlist.add(new user(17, '小琪', 97.0));
// 原本写法
// user[] users = userlist.toArray(new IntFunction<user[]>() {
// @Override
// public user[] apply(int value) {
// return new user[value];
// }
// });
// lambda写法
user[] users = userlist.toArray(value -> new user[value]);
// 实际上用不上这样的写法,只是为了举例说明
// user[] users = userlist.toArray(new user[0]);
// user[] users = userlist.toArray(user[]::new);
// 上面两种写法都可以,传值进去的size为0不影响实际的转换,具体可以看ArrayList的toArray重写方法
}
}
输出年龄大于18的男同学的成绩
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
Consumer接口,也是一个函数式接口
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
...
}
例
public class lambdaTry {
public static void main(String[] args) {
List<user> userlist = new ArrayList<>();
userlist.add(new user(19, '猫猫', 98.0));
userlist.add(new user(18, '狗狗', 95.0));
userlist.add(new user(20, '牛牛', 96.0));
userlist.add(new user(17, '小琪', 97.0));
// userlist.forEach(new Consumer<>() {
// @Override
// public void accept(user user) {
// if (user.age >= 18 && user.sex == 'g') {
// System.out.println(user.score);
// }
// }
// });
userlist.forEach(user -> {
if (user.age >= 18 && user.sex == 'g') {
System.out.println(user.score);
}
});
}
}
lambda的另一用途
简写成方法引用(method reference)方法引用
方法引用通过方法的名字来指向一个方法 方法引用可以使语言的构造更紧凑简洁 减少冗余代码
方法引用使用一对冒号 ::
主要分为四种:
构造器引用 Class::new
user[] users = userlist.toArray(user[]::new);
静态方法引用 Class::static_method
打印每个user(需要在user内重写toString)
userlist.forEach(System.out::println)
特定类的任意对象的方法引用 Class::method
特定对象的方法引用 instance::method
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


