Lambda表达式笔记

Lambda表达式:

语法:
(parameters)->expression 或者 (parameters)->{statements;}
即:(形参)->表达式 (形参)->{代码块}
->:左边的参数作用指向

总结:类似一个function,可以带参与不带参,可以有返回与无返回值

案例:

1.无参数,直接返回结果
()->1()->{System.out.print("你好Labmbda!")}
2.带一个参数
(int a)->a 或 (int a)-> {System.out.print(a);}
//JVM根据上下文推断参数的类型
(a)->a*1(a)->{System.out.print(a++);}
//如左边单个参数时可省略(),右边也是单句表达式或代码语句可省{}
a->a++   或 a->System.out.print(a)
3.带两个或两个以上的参数
(int a , String b )->{System.out.print(a);System.out.print("你好"+b)}

函数式接口

//A,B为数据类型,有方法形参 数据类似,有方法返回值 数据类型,随自己定义
public interface  Transform<A,B> {
	B transform(A a);
}

传统方式与lambda分别对该接口的使用

//传统方式使用接口
Tranform<String, Integer> transform1 = new Tranform<String, Integer(){
	@Override
        public Integer transform(String s) {
            return Integer.valueOf(s);
        }
};


//lambda 表达式
Transform<String,Integer> transform2 = (e)->Integer.valueOf(e);

访问权限
1.在Lambda表达式使用中,Lambda表达式外面的局部变量会被JVM隐式的编译成final类型,Lambda表达式内部只能访问,不能修改
案例:

public static void main(String[] args) {
        int  num = 6;//局部变量

//        System.out.println(num++);这里会编译出错
        Sum sum = value -> {
//            num = 8; 这里会编译出错
            return num + value;
        };
        System.out.println( sum.add(8));
    }
    /**
     * 函数式接口
     */
    @FunctionalInterface
    interface Sum{
        int add(int value);
    }

2.Lambda表达式内部对静态变量和成员变量是可读可写的
案例:

public class test {
    public static void main(String[] args) {
        test test = new test();
        System.out.println(test.getSum());
        test.setNum1(12);
        System.out.println(test.getSum());
    }

    public int num1 = 6;
    public static int num2 = 8;
    private int getSum(){
        Sum sum = value -> {
            num1 = value;//修改了成员变量
            num2 = 10;//修改静态变量
            return  num1 + num2;
        };
        return sum.add(1);
    }

    private void setNum1(int num1) {
        this.num1 = num1;
    }

    /**
     * 函数式接口
     */
    @FunctionalInterface
    interface Sum{
        int add(int value);
    }
}

Lambda能访问函数接口的默认方法,在函数接口中可以添加default关键字定义默认的方法

/**
     * 函数式接口
     */
    @FunctionalInterface
    interface Sum{
        int add(int value);
        default void del (int id){
            System.out.println("default方法"+id);
        }
    }
    
public static void main(String[] args) {
        Sum sun1 = value -> {
            return 1+value;
        };
        System.out.println(sun1.add(3));
        sun1.del(0);
    }

方法引用
在lambda表达式中,方法引用是一种简化写法,引用的方法就是Lambda表达式的方法体的实现
1.语法结构:ObjectRef:: methodName
类名或者实例名 :: 方法名
2.方法引用一般分为三类:
静态方法引用

public class test {
    public static void main(String[] args) {
        //传统方式
        Transform<String ,Integer> transform1 = new Transform<String, Integer>() {
            @Override
            public Integer transform(String s) {
                return test.strToInt(s);
            }
        };
        int result1 = transform1.transform("100");
        System.out.println(result1);
        //lambda表达式
        Transform<String, Integer> transform2 = test::strToInt;
        int result = transform2.transform("200");
        System.out.println(result);
    }

    static int strToInt(String str){
        return Integer.valueOf(str);
    }

    /**
     * 函数式接口
     * @param <A>
     * @param <B>
     */
    @FunctionalInterface
    interface Transform<A,B>{
        B transform(A a);
    }
}

实例方法引用

public class test {
    public static void main(String[] args) {

        //传统方式
        Transform<String ,Integer> transform1 = new Transform<String, Integer>() {
            @Override
            public Integer transform(String s) {
                return new Obj().strToInt(s);
            }
        };
        int result1 = transform1.transform("100");
        System.out.println(result1);

        //lambda表达式
        Obj obj = new Obj();
        Transform<String, Integer> transform2 = obj::strToInt;
        int result = transform2.transform("200");
        System.out.println(result);
    }

    /**
     * 实例对象类
     */
    static class Obj{
        public int strToInt(String str){
            return Integer.valueOf(str);
        }
    }

    /**
     * 函数式接口
     * @param <A>
     * @param <B>
     */
    @FunctionalInterface
    interface Transform<A,B>{
        B transform(A a);
    }
}

构造方法引用

public class test {
    public static void main(String[] args) {
        Factory factory1 = new Factory() {
            @Override
            public Parent create(String name, int age) {
                return new Boy(name,age);
            }
        };
        Boy boy = (Boy) factory1.create("小明",18);
        factory1 = new Factory() {
            @Override
            public Parent create(String name, int age) {
                return new Girl(name,age);
            }
        };
        Girl girl = (Girl) factory1.create("小红",18);
        //Lambda方式
        Factory<Boy> boyFactory = Boy::new;
        Boy boy1 = boyFactory.create("小明",18);
        boy1.doSome();
        Factory<Girl> girlFactory = Girl::new;
        Girl girl1 = girlFactory.create("小红",18);
        girl1.doSome();
    }

}

//工厂类接口
interface Factory<T extends Parent> {
    T create(String name,int age);
}

//父类
class Parent {
    private String name ;
    private int age;
    public Parent(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void doSome(){

    }
}

//男孩类
class Boy extends Parent {
    private int age ;
    private String name;
    public Boy(String name, int age) {
        super(name, age);
        this.age = age;
        this.name = name;
    }

    @Override
    public void doSome() {
        System.out.println(name+"是个男孩,"+age+"岁");
    }
}
//女孩类
class Girl extends Parent {
    private int age;
    private String name;
    public Girl(String name, int age) {
        super(name, age);
        this.age=age;
        this.name=name;
    }

    @Override
    public void doSome() {
        System.out.println(name+"是个女孩,"+age+"岁");
    }
}

五种常见的接口

Consumer接口

//Consumer接口:对入参进行操作,无返回值
//实现Consumer接口的accept方法
 Consumer<Integer> add = (a) ->{
     System.out.println("之前:"+a);
     a += 10;
     System.out.println("之后:"+ a);
 };
 //调用方法
 add.accept(5);

Predicate接口

 //Predicate接口:输入一个参数,返回boolean值,内置多种逻辑判断的默认方法
        Predicate<String> predicateStr = s -> s.length()>8;
        boolean result = predicateStr.test("test");
        System.out.println(result);
        result = predicateStr.negate().test("test");//取反,s.length<=8
        System.out.println("取反后:"+result);

Function接口

//Function接口:接受一个参数,返回单一的结果。
        //Function<参数数据类型,返回值数据类型>   返回值的类型::valueOf
        Function<String, Integer> toInteger = Integer::valueOf;
        //toInteger的执行结果作为第二个backToString的输入
        // 默认的方法(andThen)可将多个函数串在一起,形成复合Funtion(有输入,有输出)结果
        Function<String, String> backToString = toInteger.andThen(String::valueOf);
        String result = backToString.apply("123");
        System.out.println(result);

        Function<Integer, Integer> add = (i) -> {
            System.out.println("frist input:" + i);
            return i * 2;
        };
        Function<Integer, Integer> zero = add.andThen((i) -> {
            System.out.println("second input:" + i);
            return i * 0;
        });

        Integer res = zero.apply(8);
        System.out.println(res);

    }

Supplier接口

 //Supplier接口:返回一个给定类型的结果。不需要输入参数,无输入有输出
        Supplier<String> supplier = () -> "我就是输出";
        String s = supplier.get();
        System.out.println(s);

BinaryOperator接口

//BinaryOperator接口:带两个参数,数据类与返回值类型一致
        BinaryOperator<String> binaryOperare = (o1, o2)->{
            System.out.println("第一个参数:"+o1);
            return o1 + o2;
        };
        String str = binaryOperare.apply("张","小侯");
        System.out.println(str);

原文地址
添加链接描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第四章 面向对象的概念和 Java 实现-2 回顾 类是具有相同属性和行为的一组对象的 集合 , 对象是类的实例 封装是隐藏对象实现细节的过程,以便不让用户看到实现的细节 类可用Class 来定义,类的变量和方法可被该类的实例访问, 圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰符和方法修饰符 继承 继承的特点 继承的优点 继承的JAVA实现 子类构造方法 2-1 子类构造方法 2-2 调用父类构造方法的语法为: super() 或 super(参数列表) ; super () 方法始终指向调用类的父类 调用父类构造方法 演示:示例 3 多态性 2-1 多态性是指¡°多种形式¡± 它使用不同的实例而执行不同操作 多态包括方法重写和方法重载 多态性 2-2 方法重载 2-1 方法重载 2-2 演示:示例 4 方法重写 2-1 方法重写 2-2 访问修饰符 3-1 信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因 信息隐藏的原因包括: 对任何实现细节所作的更改不会影响使用该类的代码 防止用户意外删除数据 此类易于使用 访问修饰符 3-2 访问修饰符 3-3 访问修饰符可访问性 方法修饰符 static 修饰符 3-1 static修饰符修饰的方法叫静态方法 目的 使该方法独立于类的实例,使用类去访问,而不是类实例,所以也叫类方法 static 修饰符 3-2 调用静态方法的语法为: classname.methodname( ); static 修饰符 3-3 演示:示例 6 final 修饰符 abstract 修饰符 3-1 由abstract修饰的方法叫抽象方法;由abstract修饰的类叫抽象类 抽象方法必须声明在抽象类中 抽象方法语法: abstract type method_name(parameter_list); 声明抽象类语法: abstract class{…… } 使用:父类中的某些抽象不包含任何逻辑,并需要在子类中重写,子类提供这种抽象方 法的实现细节 abstract 修饰符 3-2 抽象类可以具有指向子类对象的对象引用 abstract 修饰符 3-3 演示:示例 7 接口 接口就是某个事物对外提供的一些功能的申明 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点 使用interface关键字定义接口 一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现 创建接口的步骤 2-1 // 定义方法的接口 public interface myinterface { public void add(int x, int y); public void volume(int x,int y, int z); } // 定义程序使用的常量的接口 public interface myconstants { public static final double price = 1450.00; public static final int counter = 5; } 创建接口的步骤 2-2 接口使用示例 总结 封装、继承和多态是面向对象的主要特征 继承可提高代码的重用性,使用extends关键字来实现。除了构造方法之外,父类的所有 方法和属性都被子类的对象继承 多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现 访问修饰符用于确定访问类成员的方式 Java 常用修饰符有 static、final、abstract 接口是Java编程一项重要的技术,同过它可以实现多态,同时它也弥补了Java单一继承 的不足 . . ----------------------- 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第1页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第2页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第3页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第4页。 《java面向对象程序设计-继承和多态》教案全文共5页,当前为第5页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值