Funciones relacionadas con jdk8.0 (1)

Funciones relacionadas con JDK8.0

1. La nueva sintaxis de la interfaz en JDK8.0

  • JDK8.0, los métodos estáticos se pueden definir en la interfaz, con la implementación como parte del método.

    • Sintaxis: nombre de método de tipo de valor de retorno estático público (lista de parámetros) {// parte de implementación}
  • JDK8.0, los métodos no abstractos con implementaciones predeterminadas se pueden definir en la interfaz

    • Sintaxis: nombre del método del tipo de valor de retorno predeterminado público (lista de parámetros) {// implementación del método}

En segundo lugar, la sintaxis relevante de las expresiones Lambda

  • Las expresiones Lambda implementan interfaces y crean objetos (escritura simplificada de clases internas anónimas)

  • Las expresiones Lambda introducen un nuevo símbolo y elemento de sintaxis en el lenguaje Java: "->", este operador se llama operador Lambda u operador de flecha, este operador divide la expresión Lambda en dos partes:

    • Izquierda: especifique los parámetros requeridos por la expresión Lambda
    • Derecha: especifique la parte de la función de ejecución de la expresión Lambda
  • Formato de sintaxis 1: sin parámetros, sin valor de retorno

    Nombre de la interfaz nombre de referencia = () -> {// Parte de la función de ejecución};

    Caso:

    public class Test {
        public static void main(String[] args) {
            IA ia = ()->{
                System.out.println("m1方法....");
            };
            ia.m1();
        }
    }
    interface IA{
        void m1();
    }
    

    Nota:

    • En la interfaz implementada por la expresión Lambda, solo se debe definir un método abstracto en la interfaz;
    • Si el cuerpo de implementación de la expresión Lambda tiene solo una declaración, {} se puede omitir y no se recomienda.

  • Sintaxis 2: con parámetros, sin valor de retorno

    Referencia de nombre de interfaz = (tipo de datos nombre de variable) -> {// cuerpo de implementación ...};

    Caso 1: un parámetro

    public class Test {
        public static void main(String[] args) {
           IA ia = (int n)->{
               if(n%2==0){
                   System.out.println(n+"是偶数....");
               }else{
                   System.out.println(n+"是奇数....");
               }
           };
           ia.m1(6);
        }
    }
    interface IA{
        void m1(int n);
    }
    

    Caso 2: múltiples parámetros

    public class Test {
        public static void main(String[] args) {
            IA ia = (int a,double b)-> {
                System.out.println("a="+a+",b="+b);
            };
            ia.m1(3,9.8);
        }
    }
    interface IA{
        void m1(int n,double d);
    }
    

    Nota: El tipo de datos en la expresión Lambda se puede omitir porque el compilador puede realizar inferencias de tipos.

  • Sintaxis 3: con valor de retorno

    Nombre de la interfaz nombre de referencia = (lista de parámetros) -> {declaración de retorno;}

    public class Test {
        public static void main(String[] args) {
            IA ia = (a)->{
                if(a<5){
                    a=a+1;
                }
                return a;
            };
            int r=ia.m1(3);
            System.out.println("r="+r);
        }
    }
    interface IA{
        int m1(int a);
    }
    

    Nota: Si solo hay una declaración de retorno en la expresión Lambda, se puede escribir como

    Referencia de nombre de interfaz = (lista de parámetros formales) -> expresión; no recomendado.

Tres, la aplicación práctica de expresiones Lambda

  • Aplicación práctica 1: use expresiones Lambda para implementar la interfaz Ruannble

    public class Test {
        public static void main(String[] args) {
           Runnable r = ()->{
               for(int i=0;i<10;i++){
                   System.out.println("+++++++++++++++"+i);
               }
           };
           new Thread(r).start();
        }
    }
    
  • Aplicación práctica 2: Utilizar expresiones Lambda para completar la realización de Consumer, recibir datos para completar la operación correspondiente

    public class Test {
        public static void main(String[] args) {
            Consumer<String> c = (String s)->{
                System.out.println(s);
            };
            c.accept("百知威武....");
        }
    }
    
  • Aplicación práctica 3: use la expresión Lambda para completar, enumerar el recorrido de la colección

    • Utilice la clase interna anónima para completar:

       ```
       List<String> list=Arrays.asList("胡老八","李四,"张三","胡明");
       list.forEach(new Consumer<String>() {
       		public void accept(String s) {
            	if(s.contains("胡")){
                	System.out.println(s);
                 }
            }
       });
      
    • Utilice la expresión Lambda para completar:

      List<String> list=Arrays.asList("胡老八","李四,"张三","胡明");
      list.forEach((s)-> {
      	if (s.contains("胡")) {
      		System.out.println(s);
      	}
      });
      
      只是List集合打印遍历输出: list.for((s)-> System.out.println(s))        
      
  • Ejercicio: almacene varios objetos de estudiantes en la colección ArrayList:

    • Filtrar todos los chicos de la colección de estudiantes

    • Filtrar todos los estudiantes reprobados en la colección de estudiantes

    • Filtrar todos los estudiantes varones reprobados en la colección de estudiantes

    • Filtra a todos los chicos de apellido Liu que fallaron en el grupo de estudiantes.

  • Ejercicio 2: Llame al método Collections.sort (), compare dos Srudents por clasificación personalizada (primero compare por edad y luego ordene por grado), utilizando la expresión Lambda como parámetro para aprobar.

    public class Test {
        public static void main(String[] args) {
            ArrayList<Student> list = new ArrayList();
    
            list.add(new Student("张三",23,88.0));
            list.add(new Student("李四",26,98.0));
            list.add(new Student("胡八一",25,78.0));
            list.add(new Student("胡八一",25,88.0));
    
            Collections.sort(list,(s1,s2)->{
                if(s1.getAge()>s2.getAge()){
                    return 1;
                }else if(s1.getAge()<s2.getAge()){
                    return -1;
                }else{
                    return Double.compare(s1.getScore(),s2.getScore());
                }
            });
            list.forEach((s)-> System.out.println(s));
        }
    }
    

Cuatro, interfaz funcional (las expresiones Lambda necesitan el soporte de la interfaz funcional)

  • Significado: una interfaz con un solo método abstracto en la interfaz se denomina interfaz funcional.

  • Interfaz funcional personalizada: puede utilizar la anotación @FunctionalInterface para detectar si la interfaz es una interfaz funcional.

    @FunctionalInterface
    interface IA{
        int m1(int a);
    }
    

    Nota: Debe haber solo un método abstracto en la interfaz anotado con @FunctionalInterface. Carcasa de interfaz funcional personalizada:

    public class Test {
        public static void main(String[] args) {
            int r = optional(5,(m)->{return m*m;});
            System.out.println("r="+r);
        }
        public static Integer optional(int n,MyFuntion f){
            return f.getValue(n);
        }
    }
    //对一个整数进行计算操作,将计算的结果作为返回值返回
    interface MyFuntion{
        Integer getValue(int n);
    }
    
  • Cuatro interfaces funcionales centrales integradas en Java8.0

    • Interfaz de consumidor: consumidor

      • void accept (T t); -> El parámetro es de tipo T, y el valor de retorno es de tipo void
    • Interfaz de suministro: Proveedor

      • T get (); -> El parámetro no es ningún parámetro y el valor de retorno es de tipo T
    • Interfaz funcional: Función <T, R>

      • R aplicar (T t); -> El tipo de parámetro es tipo T y el valor de retorno es tipo R
    • Interfaz de afirmación: predicado

      • prueba booleana (T t); -> El parámetro es de tipo T, y el valor de retorno es de tipo booleano


      • Caso 1: Interfaz del consumidor:

        public class TestFirst {
            public static void main(String[] args) {
                happy(20000.0,(s)-> System.out.println("拿着"+s+"元去消费...."));
            }
            public static void happy(double money, Consumer<Double> c){
                c.accept(money);
            }
        }
        
      • Caso 2: Interfaz de tipo de suministro

        public class TestFirst {
            public static void main(String[] args) {
                happy(20000.0,(s)-> System.out.println("拿着"+s+"元去消费...."));
                String str=getString(10,()->{
                    String s = "anhjshfjshsairiweriwir89863lkkqljrkql";
                    java.util.Random rd = new java.util.Random();
                    int n=rd.nextInt(s.length());
                    return s.charAt(n);
                });
                System.out.println(str);
            }
            public static String getString(int num, Supplier<Character> s){
                String result=null;
                for(int i=0;i<num;i++){
                    String str=s.get()+"";
                    result +=str;
                }
                return result;
            }
         }
        
      • Caso 3: Interfaz funcional

         public class TestFirst {
            public static void main(String[] args) {
                String r=changString("helloworld",(s)->s.toUpperCase());
                System.out.println(r);
                System.out.println(changString("helloworld",(s)->s.substring(1,4)));
            }
            public static String changString(String s, Function<String,String> f){
                return f.apply(s);
            }
        }
        
      • Caso 4: Interfaz de afirmación

        public class TestFirst {
            public static void main(String[] args) {
                List<String> list= Arrays.asList("zhangsan","lisi","wangwu","lily","tom");
                List<String> asList=filterString(list,(s)->s.length()>4);
                for(String s:asList){
                    System.out.println(s);
                }
            }
            //将集合中所有的数据元素,根据条件进行过滤
            public static List<String> filterString(List<String> list,Predicate<String> p){
                List<String> asList=new ArrayList<>();
                for(String s:list){
                    if(p.test(s)){
                        asList.add(s);
                    }
                }
                return asList;
            }
        }
        
    • Otras interfaces funcionales:

      Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Java_lover_zpark/article/details/89888188
Recomendado
Clasificación