Java8新特性 | 函数式接口

简介: 本文讲解Java8中的新特性

函数式接口

(一)函数式接口概述

在这里插入图片描述


(二)函数式接口作为方法的参数

在这里插入图片描述

测试类:

public class RunnableDemo {
    public static void main(String[] args) {
        //匿名内部类
        startThread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "启动了");
            }
        });

        //Lambda表达式
        startThread(() -> System.out.println(Thread.currentThread().getName() + "启动了"));
    }

    private static void startThread(Runnable r) {
        new Thread(r).start();
    }
}

(三)函数式接口作为方法的返回值

在这里插入图片描述

代码演示:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class ComparatorDemo {
    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<>();
        array.add("aaabbb");
        array.add("sdas");
        array.add("sda");
        System.out.println("排序前:" + array);//排序前:[aaabbb, sdas, sda]
        Collections.sort(array, getComparator());
        System.out.println("排序后:" + array);//排序后:[sda, sdas, aaabbb]
    }

    private static Comparator<String> getComparator() {
        //匿名内部类实现
//        Comparator<String> c = new Comparator<String>() {
//            @Override
//            public int compare(String s1, String s2) {
//                return s1.length() - s2.length();
//            }
//        };
//        return c;

        //匿名内部类简写
//        return new Comparator<String>() {
//            @Override
//            public int compare(String s1, String s2) {
//                return s1.length() - s2.length();
//            }
//        };

        //Lambda表达式
//        return (String s1,String s2) -> {
//          return s1.length() - s2.length();
//        };

        //Lambda表达式简写
        return (s1, s2) -> s1.length() - s2.length();
    }
}

(四)常用的函数式接口

Java8在java.util.function包下预定义了大量的函数式接口供我们使用

我们重点来学习下面的4个接口

  • Supplier接口
  • Consumer接口
  • Predicate接口
  • Function接口

1.Supplier接口

在这里插入图片描述

代码演示:

import java.util.function.Supplier;

public class SupplierDEmo {
    public static void main(String[] args) {
//        String s = getString(new Supplier<String>() {
//            @Override
//            public String get() {
//                return "小明";
//            }
//        });

        String s = getString(() -> "小明");
        System.out.println(s);//小明
        Integer i = getInteger(() -> 10);
        System.out.println(i);//10

    }
    private static Integer getInteger(Supplier<Integer> sup){
        return sup.get();
    }

    private static String getString(Supplier<String> sup) {
        return sup.get();
    }
}

2.Supplier接口练习(获取最大值)

代码演示:

import java.util.function.Supplier;

public class SupplierTest {
    public static void main(String[] args) {
        int[] arr = {19, 50, 28, 37, 46};
        int maxValue = getMax(() -> {
            int max = 0;
            for (int i = 0; i < arr.length; i++) {
                if (max < arr[i]) {
                    max = arr[i];
                }
            }
            return max;
        });
        System.out.println(maxValue);
    }

    private static int getMax(Supplier<Integer> sup) {
        return sup.get();
    }
}

3.Consumer接口

在这里插入图片描述

代码演示:

import java.util.function.Consumer;

public class ConsumerDemo {
    public static void main(String[] args) {
        //匿名内部类
        operatorString("小明", new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        //Lambda表达式
        operatorString("小明", s -> System.out.println(s));
        //方法引用
        operatorString("小明", System.out::println);

        operatorString("小明", s -> System.out.println(new StringBuilder(s).reverse().toString()));

        operatorString("王老五", s -> System.out.println(s), s -> System.out.println(new StringBuilder(s).reverse().toString()));
    }
    
    private static void operatorString(String name, Consumer<String> con) {
        con.accept(name);
    }
    //对同一个字符串数据用不同的方式消费两次
    private static void operatorString(String name, Consumer<String> con1, Consumer<String> con2) {
        con1.andThen(con2).accept(name);
    }
}

4.Consumer接口练习(按要求打印信息)

代码演示:

import java.util.function.Consumer;

public class ConsumerTest {
    public static void main(String[] args) {
        String[] strArray = {"王老五,20", "张三,30", "李四,22"};
        
        operatorString(strArray, (String str) -> {
            String name = str.split(",")[0];
            System.out.print("姓名:" + name);
        }, (String str) -> {
            int age = Integer.parseInt(str.split(",")[1]);
            System.out.println(", 年龄:" + age);
        });

        //简化代码
        operatorString(strArray, str -> System.out.print("姓名:" + str.split(",")[0]), 
                str -> System.out.println(", 年龄:" + Integer.parseInt(str.split(",")[1])));
    }

    private static void operatorString(String[] strArray, Consumer<String> con1, Consumer<String> con2) {
        for (String str : strArray) {
            con1.andThen(con2).accept(str);
        }
    }
}

5.Predicate接口

在这里插入图片描述

代码演示:

import java.util.function.Predicate;

public class PredicateDemo {
    public static void main(String[] args) {
        boolean result = checkString("hello", (String s) -> {
            return s.length() > 6;
        });
        System.out.println(result);

        //简写
        boolean result2 = checkString("helloWorld", s -> s.length() > 6);
        System.out.println(result2);

        boolean result3 = checkString("hello", s -> s.length() > 6, s -> s.length() < 15);
        System.out.println(result3);
        boolean result4 = checkString("helloWorld", s -> s.length() > 6, s -> s.length() < 15);
        System.out.println(result4);

        boolean result5 = checkString2("hello", s -> s.length() > 6, s -> s.length() < 15);
        System.out.println(result5);
        boolean result6 = checkString2("helloWorld", s -> s.length() > 6, s -> s.length() < 15);
        System.out.println(result6);
    }

    private static boolean checkString(String s, Predicate<String> p) {
//        return p.test(s);
        //否定操作
        return p.negate().test(s);
    }

    //对同一个字符串给出不同的判断条件,最后把这两个判断的结果做逻辑与运算的结果作为最终的结果
    private static boolean checkString(String s, Predicate<String> p1, Predicate<String> p2) {
//        boolean b1 = p1.test(s);
//        boolean b2 = p2.test(s);
//        boolean b = b1 && b2;
//        return  b;
        return p1.and(p2).test(s);
    }

    //对同一个字符串给出不同的判断条件,最后把这两个判断的结果做逻辑或运算的结果作为最终的结果
    private static boolean checkString2(String s, Predicate<String> p1, Predicate<String> p2) {
//        boolean b1 = p1.test(s);
//        boolean b2 = p2.test(s);
//        boolean b = b1 && b2;
//        return  b;
        return p1.or(p2).test(s);
    }
}

6.Predicate接口练习(筛选满足条件数据)

代码实现:

import java.util.ArrayList;
import java.util.function.Predicate;

public class PredicateTest {
    public static void main(String[] args) {
        String[] strArray = {"张三三,20", "王五,22", "李四四,40", "吕布布,55", "曾小贤,30"};

        //调用方法,编写满足条件
//        ArrayList<String> people = checkPeople(strArray, str -> {
//            String name = str.split(",")[0];
//            return name.length() > 2;
//        }, str -> {
//            int age = Integer.parseInt(str.split(",")[1]);
//            return age > 33;
//        });

        //简写
        ArrayList<String> people = checkPeople(strArray, str -> str.split(",")[0].length() > 2
                , str -> Integer.parseInt(str.split(",")[1]) > 33);

        //遍历集合
        for (String s : people) {
            System.out.println(s);
        }
    }

    private static ArrayList<String> checkPeople(String[] strArray, Predicate<String> p1, Predicate<String> p2) {
        //定义一个集合
        ArrayList<String> array = new ArrayList<>();

        //遍历数组,将满足条件的数据添加进入集合中
        for (String str : strArray) {
            if (p1.and(p2).test(str)) {
                array.add(str);
            }
        }
        return array;
    }
}

7.Function接口

在这里插入图片描述

代码演示:

import java.util.function.Function;

public class FunctionDemo {
    public static void main(String[] args) {
        convert("100", s -> Integer.parseInt(s));
//        convert("100", Integer::parseInt);//方法引用

        convert(100, i -> String.valueOf(i + 10));

        convert("100", s -> Integer.parseInt(s), i -> String.valueOf(i + 10));
    }

    //定义一个方法,把一个int类型的数据加上一个整数之后,转换为字符串在控制台输出
    private static void convert(String s, Function<String, Integer> fun) {
//        Integer i = fun.apply(s);
        //自动拆箱
        int i = fun.apply(s);
        System.out.println(i);
    }

    //定义一个方法,把一个字符串转换为int类型的数据加上一个整数后,转换为字符串在控制台输出
    private static void convert(int i, Function<Integer, String> fun) {
        String s = fun.apply(i);
        System.out.println(s);
    }

    //定义一个方法,把一个字符串转换为int类型,把int类型的数据加上一个整数之后,转换为字符串在控制台输出
    private static void convert(String s, Function<String, Integer> fun1, Function<Integer, String> fun2) {
//        Integer i = fun1.apply(s);
//        String ss = fun2.apply(i);
//        System.out.println(ss);
        String ss = fun1.andThen(fun2).apply(s);
        System.out.println(ss);
    }
}

8.Function接口练习(按照指定要求操作数据)

代码实现:

import java.util.function.Function;

public class FunctionTest {
    public static void main(String[] args) {
        String s = "林小青,30";
        convert(s, ss -> ss.split(",")[1], ss -> Integer.parseInt(ss), i -> i + 70);
    }

    private static void convert(String s, Function<String, String> fun1, Function<String, Integer> fun2, Function<Integer, Integer> fun3) {
        //这里解释上面调用时 s和ss的混乱
//        String ss = fun1.apply(s);
//        Integer i = fun2.apply(ss);
//        Integer i2 = fun3.apply(i);
        int i2 = fun1.andThen(fun2).andThen(fun3).apply(s);
        System.out.println(i2);
    }
}

目录
相关文章
|
18天前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
15 4
Java——接口的使用实例
|
6天前
|
安全 Java API
java安全特性
java安全特性
20 8
|
4天前
|
Java 测试技术
Java接口的生产环境应用注意点
在Java生产环境中,合理使用接口对提升代码质量至关重要。设计接口时应遵循单一职责原则,采用清晰命名,并控制方法数量。默认方法应谨慎使用,避免与实现类产生冲突。通过版本化管理接口更新,确保向后兼容。实现接口时需明确行为,保持实现与接口分离,利用多态增强灵活性。关注性能影响,适当文档注释及充分测试确保接口稳定可靠。综合运用这些策略,可以显著提高系统的可扩展性和维护性。
|
4天前
|
Java
Java 接口的简化理解
Java 接口是一种强大的概念,用于定义方法签名而非具体实现,作为行为规范,强调功能而非实现细节。接口是特殊的引用类型,包含常量和方法签名。其特点包括:无实现方法体、支持多重继承、内置常量定义。通过示例展示了如何定义和实现接口,以及如何通过接口引用调用实现类的方法。接口的应用场景包括抽象化、插件架构和松耦合设计。从 Java 8 起,接口还支持默认方法和静态方法,进一步增强了其灵活性和扩展性。理解接口是 Java 编程的基础之一。
|
7天前
|
JavaScript 前端开发 Java
Java 8 新特性详解及应用示例
Java 8 新特性详解及应用示例
|
5天前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
8天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
12天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
22 7
|
9天前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
35 2
|
17天前
|
机器学习/深度学习 人工智能 安全
python和Java的区别以及特性
Python:适合快速开发、易于维护、学习成本低、灵活高效。如果你需要快速上手,写脚本、数据处理、做点机器学习,Python就是你的首选。 Java:适合大型项目、企业级应用,性能要求较高的场景。它类型安全、跨平台能力强,而且有丰富的生态,适合更复杂和规模化的开发。
18 3
下一篇
无影云桌面