• java8:函数式接口


    1、Comparator接口

    @FunctionalInterface
    public interface Comparator<T> {

    (1)普通方式:

    public static void main(String[] args) {
            List<String>list= Arrays.asList("ni","hao");
            Collections.sort(list, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return o2.compareTo(o1);
                }
            });
            System.out.println(list);
        }

    (2)方式二:

        public static void main(String[] args) {
            List<String>list= Arrays.asList("ni","hao");
            Collections.sort(list,(String o1,String o2)->{
                return o2.compareTo(o1);
            });
            System.out.println(list);
        }

    (3)方式三:

      public static void main(String[] args) {
            List<String>list= Arrays.asList("ni","hao");
            Collections.sort(list,(o1,o2)->o2.compareTo(o1));
            System.out.println(list);
        }

    2、lambda表达式的作用

    (1)可以传递行为,而不仅仅是值

    提升抽象层次

    API重用性更好

    更加灵活

    3、基本语法

    (参数)->{方法体}
    (arg1,,arg2)->(body)

    举例:

    int a,int b)->{return a+b;}//表示一个加法操作
    ()->System.out.println("ni hao");//打印
    (String s)->{System.out.println(s);}//打印出参数的值
    ()->42//不接收参数,返回42

    4、lambda表达式的结构

    (1)lambda表达式可以有零个或多个参数

    (2)参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果一样

    (3)所有的参数都必须包含在圆括号内,参数之间用逗号相隔。例如:(a,b)或(int a, int b)

    (4)空的圆括号代表参数集为空

    (5)当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a->return a*a
    (6)Lambda 表达式的主体可包含零条或多条语句
    (7)如果Lambda表达式的主体只有一条语句,花括号可省略。匿名函数的返回类型与该主体表达式一致
    (8)如果Lambda表达式的主体包含一条以上语句,则表达式必须包含在花括号中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

    5、Function接口举例

    (1)源码:

    @FunctionalInterface
    public interface Function<T, R> {
    
        /**
         * Applies this function to the given argument.
         *
         * @param t the function argument
         * @return the function result
         */
        R apply(T t);

    (2)运用:

     public int compute(int a,Function<Integer,Integer> function){
            int result=function.apply(a);
            return result;
        }
        public static void main(String[] args) {
            Test1 test1=new Test1();
            System.out.println(test1.compute(1,value->{return 2*value;}));
            System.out.println(test1.compute(2,value->5+value));
            System.out.println(test1.compute(3,value->value*value));
        }

    另外一种书写方式:

        public int compute(int a,Function<Integer,Integer> function){
            int result=function.apply(a);
            return result;
        }
        public static void main(String[] args) {
            Test1 test1=new Test1();
            Function<Integer,Integer> function=value-> value *2;
            System.out.println(test1.compute(4,function));
        }

    拼接字符串:

        public String convert(int a,Function<Integer,String> function){
            return function.apply(a);
        }
        public static void main(String[] args) {
            Test1 test1=new Test1();
            System.out.println(test1.convert(34,value->String.valueOf(value+"hello")));
        }

    与以前的先定义函数,然后创建对象调用函数不同,采用lambda表达式的方式是在调用函数的时候才向函数指出行为(即:函数的操作),而普通情况下是在函数中已经定义好了行为,对象直接调用即可。

    6、高阶函数

    如果一个函数接受一个函数作为参数,或者返回一个函数作为返回值

     public String convert(int a,Function<Integer,String> function){
            return function.apply(a);
        }
  • 相关阅读:
    理解css中min-width和max-width,width与它们之间的区别联系
    html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果
    web页面的重构和回流【转载】
    介绍web开发中实现会话跟踪的常用技术方法
    web标签语义化的理解_web语义化是什么意思
    从浏览器地址栏输入url到显示页面的步骤(以HTTP为例)
    H5调用手机的相机/摄像/录音等功能 _input:file的capture属性说明
    相邻元素之间的margin合并问题
    HTML连载33-背景定位
    Java连载22-for循环
  • 原文地址:https://www.cnblogs.com/zhai1997/p/12594613.html
Copyright © 2020-2023  润新知