zoukankan      html  css  js  c++  java
  • .Net转Java自学之路—基础巩固篇二十(Lambda)

    Lambda表达式

      语义本身就代表了做事情的动作,没有对象的概念在其中。

      Java中使用Lambda表达式的前提:必须有 函数式接口。

      概念:有且只有一个的抽象方法的接口就叫函数式接口。

      为确保当前接口为函数式接口,在定义接口的前一行加 @FunctionalInterface

      格式:

    @FunctionalInterface
    public interface 函数式接口名{
        //Code...
    }

      Lambda表达式使用必须要有函数式接口的推断环境。

        1、要么通过方法的参数类型类确定是那个函数式接口。

        2、要么通过复制操作来确定是那个函数式接口。

      Lambda的格式就是将抽象方法分解成为以下三点:

        1、参数  

        2、箭头  

        3、代码

      例:

    public sbstract int sum(int a,int b);
    //Lambda的标准格式:
    (int a,int b) -> {return a+b;}
    //Lambda的简化格式:
    (a,b) -> a+b
    //若参数有且只有一个参数,可以省略小括号。

    实例:

    @FunctionalInterface
    public interface Calculator{
        public sbstract int sum(int a,int b);//int sum(int a,int b);
    }
    
    public class CalculatorImpl implements Calculator{
        public int sum(int a,int b){
            return a+b;
        }
    }
    
    public static void main(String[] args){
        Calculator calculator=new CalculatorImpl();
        method(calculator);
        //等于
        method((a,b) -> a+b);
    }
    
    public static void method(Calculator calculator){
        int result=calculator.sum(1,2);
        System.out.println(result);
    }
    View Code

      方法引用:

        防止Lambda表达式的代码冗余。

        若Lambda表达式定义的动作在其他类中已经定义,那么使用方法引用来解决。

        第一种:类名引用静态方法格式

          类名::静态方法

        第二种:对象名引用成员方法格式

          对象名::成员方法名

    实例:

    @FuncationalInterface
    pulic interface Calculator{
        void show(string str);
    }
    
    public class Test{
        public static void methodShow(String str){
            System.out.println(str);
        }
    }
    
    public static void main(String[] args){
        method(str -> System.out.println(str));
        //或者
        method(Test::methodShow);
        //或者
        Test test=new Test();
        method(test::methodShow);
        //或者
        method(System.out::println);//System.out其实就是jdk创建好的对象,println时System.out的成员方法
    
        /*总结:
            1、一定要有函数式接口,才能使用lambda
            2、对于重复的lambda场景,可以使用方法引用来进行简化。
        */
    }
    
    public static void method(Calculator calculator){
        calculator.show("内容");
    }

    实例:使用 集合for遍历冗余场景 去掉成绩不及格的成员

    ArrayList<String> arr=new ArrayList<String>();
    arr.add("a,90");
    arr.add("ab,70");
    arr.add("abc,50");
    
    //截取
    ArrayList<String> scoreList=new ArrayList<String>();
    for(int i=0;i>arr.size();i++){
        String[] strList=arr.get(i);
        String score=strList[1];
        scoreList.add(score);
    }
    
    //String转int
    ArrayList<Integer> numList=new ArrayList<Integer>();
    for(int i=0;i<scoreList.size(); i++){y8
        int num=Integer.parseInt(scoreList.get(i));
        numList.add(num);
    }
    
    //过滤
    ArrayList<String> resultList=new ArrayList<String>();
    for(int i=0; i<numList.size(); i++){
        int num=numList.get(i);
        if(num>60){
            resultList.add(num);
        }
    }
    
    //打印输出
    for(int i=0; i<resultList.size();i++){
        System.out.println(resultList.get(i));
    }
    View Code
    //java8的简化stream流式操作
    ArrayList<String> arr=new ArrayList<String>();
    arr.add("a,90");
    arr.add("ab,70");
    arr.add("abc,50");
    
    //Stream API更优写法   map映射   filter过滤  forEach遍历
    arr.stream().map(s -> s.split(",")[1]).map(Integer::parseInt)
    .filter(n -> n>60).forEach(System.out::println);

    Stream API 流式操作

      Java 8当中的“流”其实就是Stream接口的对象。

      JDK提供了一个流接口,java.util.stream.Stream<T>

      获取流的方式:

        1、根据集合获取流:集合对象名称.stream();

        2、分解数组获取流:Stream.of(数组名称)  数组当中的元素必须是引用类型

    //实例1
    ArrayList<String> arr=new ArrayList<String>();
    arr.add("a");
    arr.add("ab");
    arr.add("abc");
    
    Stream<String> streamA=arr.stream();
    
    //实例2
    String[] strList={"","",""};
    Stream<String> streamS=Stream.of(strList);

      流的映射map:

        获取流之后,使用映射方法:map(用于转换的Lambda表达式)

        映射:就是将一个对象转换成为另一个对象,把老对象映射到新对象上。

    ArrayList<String> arr=new ArrayList<String>();
    arr.add("1");
    arr.add("2");
    arr.add("3");
    
    Stream<Integer> streamA=arr.stream().map((String str) -> {
        int num=Integer.parseInt(str);
        return num;
    });
    //简化 详细步骤如下:
    streamA=arr.stream().map(str -> {
        int num=Integer.parseInt(str);
        return num;
    });
    streamA=arr.stream().map(str -> {
        return Integer.parseInt(str);
    });
    streamA=arr.stream().map(Integer::parseInt);//方法引用

    实例:

    ArrayList<String> arr=new ArrayList<String>();
    arr.add("a,90");
    arr.add("ab,70");
    arr.add("abc,50");
    
    //Lambda的标准写法
    Stream<String> streamA=arr.stream().map((String s) -> {
        String[] strList=s.split(",");
        String result=strList[1];
        return result;
    });
    
    //简化 步骤:
    streamA=arr.stream().map(s -> {
        String[] strList=s.split(",");
        String result=strList[1];
        return result;
    });
    streamA=arr.stream().map(s -> {
        String[] strList=s.split(",");
        return strList[1];
    });
    streamA=arr.stream().map(s -> {
        return s.split(",")[1];
    });
    streamA=arr.stream().map(s -> s.split(",")[1]);
    View Code

      filter 过滤

        filter 能产生boolean结果的Lambda;true则取,false则丢

    ArrayList<String> arr=new ArrayList<String>();
    arr.add(90);
    arr.add(70);
    arr.add(50);
    
    Stream<Integer> streamA=arr.stream().filter((int num) -> {
        boolean b=num>60;
        return num;
    });
    //简化 步骤:
    streamA=arr.stream().filter(num -> {
        boolean b=num>60;
        return num;
    });
    streamA=arr.stream().filter(num -> {
        return num>60;
    });
    streamA=arr.stream().filter(num -> num>60);

      forEach 遍历

        forEach(Lambda表达式);

           参数Lambda表达式必须是一个能够消费的一个参数,而且不产生结果的Lambda表达式。

    ArrayList<String> arr=new ArrayList<String>();
    arr.add(90);
    arr.add(70);
    arr.add(50);
    
    Stream<Integer> streamA=arr.stream().forEach((int i) -> {
        System.out.println(i);
    });
    //简化 步骤:
    streamA=arr.stream().forEach(i -> {
        System.out.println(i);
    });
    streamA=arr.stream().forEach(i -> System.out.println(i));
    streamA=arr.stream().forEach(System.out::println);

      并发(Paralle)流

        对流中的元素进行多个人同时处理,这就是并发。

    ArrayList<String> arr=new ArrayList<String>();
    //获取一个并发流
    arr.parallelStream().........
    //或  若已经获取一个普通流,那么只要再调用一下parallel()也会变成并发流
    arr.stream().parallel()......
  • 相关阅读:
    ##微信登陆,给大家分享一个第三方登陆
    ##Solr的各种版本下载
    ##redis在linux上的安装详解
    ##activeMq的简介与安装
    ##Springboot框架--配置文件介绍
    论面向服务架构及其应用
    MVC架构模式
    第八周总结
    细化架构阅读笔记
    第五周总结
  • 原文地址:https://www.cnblogs.com/zltao/p/10385425.html
Copyright © 2011-2022 走看看