java函数式接口

115 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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);
    }
}