你眼中java8的样子

本文介绍了Java 8中的关键特性,如函数式接口、Lambda表达式、Supplier、BinaryOperator和Optional,展示了如何利用这些特性提升代码简洁性和抽象层次。通过实例和方法引用,讲解了如何在实际编程中灵活运用这些功能。
摘要由CSDN通过智能技术生成

你眼中java8新特性的样子

1. 函数式接口

1. 定义

如果一个接口有且只有一个抽象方法,那么该接口接口一个函数式接口

如果在接口上声明FunctionalInterfance,那么就会将按照函数式接口来要求该接口

如果一个接口有且只有一个抽象方法,但是并没有声明FunctionalInterfance 注解,那么编译器依旧会将该接口看作sshi函数式接口

2. Lambda

1. 作用

1. Lamdba 表达式为java添加了缺失的函数式编程特性,是我们能将函数当作一等公民看待
2. 在将函数作为作为一等公民的语言中,Lamdba表达式的类型是函数。但在Java中,Lambda是对象,他们必须依附于一类特别的对象类型-函数式接口(functional interfance)

2. 概要

Java Lamdba表达式是一种匿名函数;它是没有声明的方法,即没有访问修饰符、返回值和名字

3. 作用

传递行为,不仅仅是值
提升抽象层次
API重用性更好
更加灵活

4. 基本语法

  1. (arguments)-> {body}

  2. demo

    (arg1,arg2) -> {body}

    (type1 arg1, type2 arg2) -> {body}

  3. 实例

    1. (int a,int b) -> {return a+b;}
    2. () -> {System.out.pringln(“1111”);}
    3. (String s) -> {System.out.pringln(s);}
    4. () -> 111
    5. ()
  4. 说明

    1.一个参数可以省略小括号,一个公式可以省略花括号

    2.类型可以推导,可以省略类型声明

3. function

package com.maidou.learning.java8.function;

import java.util.function.BiFunction;
import java.util.function.Function;

public class FunctionTest1 {

    public static void main(String[] args) {

        FunctionTest1 functionTest1 = new FunctionTest1();

        System.out.println(functionTest1.computer(2, value -> value + 2, value -> value * value));
        System.out.println(functionTest1.andThen(2, value -> value + 2, value -> value * value));

        System.out.println(functionTest1.computer(2,3 ,  (value1, value2) -> value1 + value2));

        System.out.println(functionTest1.andThen(2,3 ,  (value1, value2) -> value1 + value2, value -> value * value));
    }

    /**
     * @Author maicheng
     * @Description 先应用后作用于当前funcation
     * @Date 15:26 2022/10/16
     * @Param [a, funcation1, function2]
     * @return int
     **/
    public int computer(int a, Function<Integer, Integer> funcation1, Function<Integer, Integer> function2) {

        return funcation1.compose(function2).apply(a);
    }

    /**
     * @Author maicheng
     * @Description 先作用于当前funcation后应用
     * @Date 15:27 2022/10/16
     * @Param [a, funcation1, function2]
     * @return int
     **/
    public int andThen(int a, Function<Integer, Integer> funcation1, Function<Integer, Integer> function2) {

        return funcation1.andThen(function2).apply(a);
    }

    public int computer(int a, int b, BiFunction<Integer, Integer, Integer> biFunction) {

        return biFunction.apply(a, b);
    }

    public int andThen(int a, int b, BiFunction<Integer, Integer, Integer> biFunction, Function<Integer, Integer> function2) {

        return biFunction.andThen(function2).apply(a,b);
    }
}

4. supplier

1. coding

package com.maidou.learning.java8;

/**
 * @Author maichen
 * @Description : 学生对象信息
 * @Date 23:12 2022/10/16
 **/
public class Student {

    private String name = "zhangsan";

    private int age = 20;

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


package com.maidou.learning.java8;

import java.util.function.Supplier;

public class StudentTest {

    public static void main(String[] args) {
        // 方案一
        Student student = new Student();
        System.out.println(student.getName());

        // 方案二
        Supplier<Student> supplier = () -> new Student();
        System.out.println(supplier.get().getName());

        // 方案三
        Supplier<Student> supplier1 = Student::new;
        System.out.println(supplier1.get().getName());
    }
}

2. 简介

Supplier是Java8配合Lambda表达式和函数式接口编程组合使用的一个接口,对外表现为 ::

接口Supplier 最适合表示工厂。带有Supplier 的方法,通常应该限制输入工厂的类型参数使用有限制的通配符类型,以便客户端可以传入工厂,来创建制定类型的任意子类。

5. BinaryOperatorTest

1. coding

package com.maidou.learning.java8;

import java.util.Comparator;
import java.util.function.BinaryOperator;

public class BinaryOperatorTest {

    public static void main(String[] args) {
        BinaryOperatorTest binaryOperatorTest = new BinaryOperatorTest();
        System.out.println(binaryOperatorTest.getBinaryOperator(1,2, (a,b) -> a + b));
        System.out.println(binaryOperatorTest.getBinaryOperator(1,2, (a,b) -> a - b));

        binaryOperatorTest.getMin(1,2, Comparator.comparingInt(a -> a));
    }

    public int getBinaryOperator(int a, int b, BinaryOperator<Integer> binaryOperator) {
        return binaryOperator.apply(a,b);
    }

    public int getMin(Integer a, Integer b, Comparator<Integer> comparator) {

        return BinaryOperator.minBy(comparator).apply(a,b);
    }
}

6. Optional

1. coding

package com.maidou.learning.java8;

import java.util.Optional;

public class OptionalTest {

    public static void main(String[] args) {
        Optional<String> optional = Optional.of("111");
        System.out.println(optional.get());
        //判空
        optional.ifPresent(str -> System.out.println(str));
    }
}

7. 方法引用

1. 语义

方法引用实际上是lambda表达式的一种语法糖

可以将方法引用看作是一个函数指针,function pointer

classname::staticmethod

2. 分类

  1. 类名::静态方法
  2. 引用名(对象)::实例方法
  3. 类名::实例方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值