1.Lambda表达式主要用于简写接口的操作等出现匿名内部类的地方,如下:我这里先定义一个Swim接口,以及它所定义的swim()方法

interface Swim{
        void swim();
}

2.定义一个类Person操作这个接口:

class Person implements Swim{

    @Override
    public void swim() {
        System.out.println("人会游泳");
    }
}

3.在我的主类TestLambda中测试该接口:

public class TestLambda {private  static void show(Swim swim){        swim.swim();    }

    public static void main(String[] args) {

      //  简单的对接口的操作
    show(new Person());
    show(new Swim() {
        @Override
        public void swim() {
            System.out.println("不知道是谁会游泳");
        }
    });
    show(()-> System.out.println("不知道是谁,也不知道它(他)会干什么");//当然我们通过Lambda看不出来操作了那个接口,但编译程序是知道的

相同原理的里一个例子(对应上面例子的三种方法):

String[] s = {"Justin","Monic","Irene"};
//第一种方法:构建操作接口的类
        class MyComparator implements Comparator<String>{
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        }
 Comparator<String> comparator3 = new MyComparator();//创建类操作接口并实例化该类
Arrays.sort(s,comparator2);
//第二种方法:匿名化接口的操作
 Arrays.sort(s, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.length()-o2.length();
        }
    });
//第三种方法:lambda
Arrays.sort(s,(o1, o2) ->{return o1.length()-o2.length();});//只有一条语句时{}可省略并且return也可省略。Lambda表达式中,当没有参数传入时,()时不可以省略的,只有一个参数传入时,()可以省略,两个两个以上的参数传入时,()不可以省略

Lambda中的方法参考:

1.还是先以Swim接口的操作为例:

首先我们在TestLambda类中写入一下方法

static void classSwim(){
        System.out.println("不知道是谁,也不知道它(他)会干什么"); }

在mian()方法中操作接口:

 show(()->TestLambda.classSwim());//等同于show(TestLambda::classSwim);

2.以Arrays.sort()方法为例:

首先我们在TestLambda类中写入一下方法:

static int bylength(String o1,String o2){
        return o1.length()-o2.length();
    }

在mian()方法中操作接口:

 Arrays.sort(s,(o1, o2) -> TestLambda.bylength(o1,o2));
    Arrays.sort(s, TestLambda::bylength);//参考TextLambda,bylength方法

另外,如果参考方法的方法体中,只是调用了传入参数的类型的类类的某个方法,可写作:

//TestLambda类中的一个静态方法
static int byLength(String o1,String o2){
        return o1.compareTo(o2);//该静态方法只是调用了String的compareTo()方法
    }//mian()方法中:
//Lambda本来可写为一下:
 Arrays.sort(s, TestLambda::byLength);
//也可写作:
Arrays.sort(s,String::compareTo);

方法参考总结:当一个静态方法与操作接口的方法具有相同的参数类型参数个数以及返回值时,可以使用该静态方法代替操作接口的方法

特定对象的方法参考:

先以Swim接口为例:

//TestLambad中写入如下方法
void clasSwim2(){
        System.out.println("我是classSwim2,我被classSwim调用");
//main()方法中:
show(()->new TestLambda().clasSwim2());//等同于
    TestLambda testLambda = new TestLambda();
     show(testLambda::clasSwim2);

然后再看List类的forEach()方法

//out是printStream实例
//s接上面例子
List<String> list = Arrays.asList(s);
          list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);//调用out实例的println()方法
            }
        });

//等同于
        list.forEach(System.out::println);

关于接口:

default修饰接口中的方法表示,操作该接口的类可以选择不操作default修饰的方法。

(1). 如果父接口中有个默认方法,子接口中再度声明与父接口默认方法相同的方法命名,但没有写default也就是没有方法操作,那么子接口中该方法直接重新定义了父类中的默认方法操作为抽象方法。 (2). 如果两个接口都定义了相同方法命名的默认方法,而新的接口同时继承这两个接口,那么会引发冲突,当新的接口没有重新定义方法时,就会发生变异错误,解决途径就是明确重新定义方法或者可使用接口.super.方法的方式指定继承的那个接口的方法。(3)如果类操作两个接口拥有相同的父接口,其中一个重新定义了父接口的默认方法而另一个没有,那么操作类将采用重新定义的版本。(4)如果子类继承父类同时操作了某接口,而父类中的方法与接口中的默认方法具有相同的方法命名,则采用父类的方法定义。

另外JDK8除了让接口可以定义默认方法以外,也开始允许在接口中定义静态方法,此方法要写方法体,调用和类中的静态方法调用相似。

Java基础语法-Lambda表达式的更多相关文章

  1. Java基础教程——Lambda表达式

    Lambda表达式 Java8引入Lambda表达式,可以使代码更简洁. 格式:参数,箭头,代码 (参数名)->{代码} Lambda表达式体现了"函数式编程思想"-- 面向 ...

  2. 033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结

    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结 本文知识点:运算符和表达式知识点总结 前面学习的几篇文都是运算符和表达式相关的知 ...

  3. Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】

    原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...

  4. java基础语法要点<二>(基于1.8)

    注解(元数据) 从jdk5 开始,java支持在源文件中嵌入补充信息,称为注释(annotation).注释不会改变程序的动作,也就不会改变程序的语义.但在开发和部署期间,各种工具可以使用这类信息.元 ...

  5. java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...

  6. java 8 中lambda表达式学习

    转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...

  7. Java基础语法(上篇)

                     Java基础语法(上篇) 知识概要: (1)关键字的表示与规范       (2)标示符              (3)注释                (4 ...

  8. Lambda 表达式,Java中应用Lambda 表达式

    一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...

  9. Java基础语法入门01

    Java基础语法入门01 学习java你要先进行去了解JDK,JRE,JVM JDK Java开发工具包 JRE Java语言开发的运行环境 JVM Java虚拟机,用于Java语言的跨平台所用. 当 ...

随机推荐

  1. docker+ubuntu14.04+cuda7.0

    参考链接: http://tleyden.github.io/blog/2014/10/25/docker-on-aws-gpu-ubuntu-14-dot-04-slash-cuda-6-dot-5 ...

  2. BZOJ 4763

    有毒 第一开始一直RE,我就把dfs改成了bfs 结果一直TLE,自己造的数据要跑8s 因为 lxl 等人讲随机 $\sqrt{n}$ 个点作为关键点就可以了 但是我把随机改成深度有关就AC了,而且那 ...

  3. IDEA环境下SSM整合------环境配置

    声明:本文纯为个人笔记整理,如有不妥之处还望及时指出,欢迎转载! 只为解决操作问题,可以从第二幅图往后看! 一.做不出详细的概念叙述和文本设计,本文主要以实战步骤为主,少量解释为辅助,下面请大家牢记两 ...

  4. 3. Scala运算符

    3.1 运算符介绍 运算符是一种特殊的符号,用以表示数据的运算.赋值和比较等 1) 算术运算符 2) 赋值运算符 3) 比较运算符(关系运算符) 4) 逻辑运算符 5) 位运算符 3.2 算术运算符 ...

  5. [dev] udp socket的read长度问题

    场景描述 我的两个程序需要彼此通信.采用unix socket来实现. 并为了简单起见使用了DGRAM,也就是udp通信. 问题描述 1. 用法是这样的 收包的一端使用epoll监听,发包端发送一个2 ...

  6. Yocto和Android编译命令的简化和自动完成的实现

    简化编译命令 无论是在Android编译系统中,还是在Yocto编译系统中,要编译一个目标,输入命令都有点费事. Yocto系统: source setup-environment $FOLDER b ...

  7. MySQL中dblink的实现(通过federated引擎实现)

    最近项目中涉及MySQL数据库视图的创建,需要整合两个位于不同服务器上数据库的内容,就遇到了远程访问数据库的问题.在oracle中可以通过dblink来实现跨本地数据库来访问另外一个数据库中的数据.通 ...

  8. mysql8.0.13免安装版的安装配置详解

    一.下载 下载地址:https://dev.mysql.com/downloads/mysql/ 二.解压到某个目录,例如:D:/mysql/mysql-8.0.13-winx64 三.配置环境变量 ...

  9. 洛谷P4456 交错序列[CQOI2018] dp+数论

    正解:dp 解题报告: 传送门 首先可以先拆下这个贡献式,为了方便之后设状态什么的,把式子转成和ny有关,就成了 \(\sum \left ( n-i \right )^{a}\cdot i^{b}\ ...

  10. springboot热部署配置

    1.pom添加spring-boot-devtools依赖和配置编译插件 <dependency> <groupId>org.springframework.boot</ ...