持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
新时代的程序员:lambda表达式、函数式接口、Stream流式计算、链式编程、异步调用
lambda表达式
基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表达式由三部分组成:
paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。 ->:可理解为“被用于”的意思 statements:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回。
public static void main(String[] args) {
// Function<String, String> function = new Function<String, String>() {
// @Override
// public String apply(String str) {
// return str;
// }
// };
Function<String, String> function = (str)->{return str;};
System.out.println(function.apply("啦啦啦啦啦"));
}
函数式接口
如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的,保证安全。Function函数式接口
Function 函数型接口
Function 函数型接口, 有一个输入参数,有一个输出
public static void main(String[] args) {
//输出大写后的原字符串
Function<String, String> function = str -> str.toUpperCase();
System.out.println(function.apply("abc"));
}
Predicate 断定型接口
有一个输入参数,返回值只能是 布尔值!
public static void main(String[] args) {
//判断一个字符串是否为a开头
Predicate<String> predicate = s -> !s.isEmpty() && s.charAt(0) == 'a';
System.out.println(predicate.test("abc"));
}
Consumer 消费型接口
只有输入没有输出
public static void main(String[] args) {
//输出一个大写字符串
Consumer<String> consumer = s -> System.out.println(s.toUpperCase());
consumer.accept("abc");
}
Supplier 供给型接口
没有参数,只有输出值
public static void main(String[] args) {
//返回一个Demo对象
Supplier<Demo> supplier = () -> {return new Demo();};
System.out.println(supplier.get().hashCode());
}
Stream流式计算
存储交给集合,计算交给流 /**
- 题目要求:只用一行代码实现
- 现在有五个用户!筛选:
- 1、ID必须是偶数
- 2、年龄必须大于23岁
- 3、用户名转化为大写字母
- 4、用户名字母倒着排序
- 5、只输出一个用户 */
public class Test {
public static void main(String[] args) {
User u1 = new User(1,"a",21);
User u2 = new User(2,"b",22);
User u3 = new User(3,"c",23);
User u4 = new User(4,"d",24);
User u5 = new User(5,"e",25);
User u6 = new User(6,"f",26);
//集合用来存储
List<User> list = Arrays.asList(u1, u2, u3, u4, u5,u6);
//使用stream计算
//lambda表达式、链式编程、函数式接口、Stream流式计算
list.stream()
.filter(u->{return u.getId()%2 == 0;})
.filter(u->{return u.getAge() > 23;})
.map(u->{return u.getName().toUpperCase();})
.sorted((uu1,uu2)->{return uu2.compareTo(uu1);})
.limit(1)
.forEach(System.out::println);
}
}