Java函数式编程之Java8四大函数接口

【前序】:在Java8中,内置了四个核心函数接口,它们存在是Lamda表达式出现的前提,Lamda表达式想重写函数式接口中的唯一方法。函数式接口与Lambda表达式之间的关系:lambda表达式相当于是一个行为,传入函数式接口中,进来实现各种操作。它们的接口内只有一个抽象方法,每一个函数式接口都有@FunctionalInterface注解。文章目录1.消费型接口2.供给型接口3.函数型接…

大家好,又见面了,我是你们的朋友全栈君。

【前序】:

在Java8中,内置了四个核心函数接口,它们存在是Lamda表达式出现的前提,Lamda表达式想重写函数式接口中的唯一方法。
函数式接口与Lambda表达式之间的关系:lambda表达式相当于是一个行为,传入函数式接口中,进来实现各种操作,即行为参数化

它们的接口内只有一个抽象方法,每一个函数式接口都有@FunctionalInterface注解。

【正文】:

四种函数式接口分别为:

  1. Consumer< T>:消费型接口
    接口方法 void accept(T t):参数类型是T,无返回值
  2. Supplier< T>供给型接口
    接口方法 T get():参数类型是T,返回T类型参数
  3. Function<T,R>函数型接口</T,R>
    接口方法R apply(T):对类型T参数操作,返回R类型参数
  4. Predicate< T>段言型接口
    接口方法 boolean test(T t):对类型T进行条件筛选操作,返回boolean

1.消费型接口

先看一下源码:

import java.util.Objects;
 
@FunctionalInterface
public interface Consumer<T> { 
   
 
    void accept(T t);
 
    default Consumer<T> andThen(Consumer<? super T> after) { 
   
        Objects.requireNonNull(after);
        return (T t) -> { 
    accept(t); after.accept(t); };
    }

消费型接口代表了在一个输入参数上需要进行的操作。

举例1⃣️:

import java.util.function.Consumer;
 
public class Test { 
   
    public static void main(String[] args) { 
   
        Test consumertest = new Test();
        //传入字符串,然后打印
        consumertest.pass("I'm consumerFunction", (item) -> System.out.println(item));
    }
    
    //接受str字符串参数
    public void pass(String str, Consumer<String> consumer) { 
   
        consumer.accept(str);
    }
 }

函数式接口相当于把一个行为当作参数传入一个方法中,在这个例子中,System.out.println(item)是Consumer consumer的行为,即打印出所传入的参数str。

举例2⃣️:

Consumer<Integer> consumer = x -> { 
   
            int a = x + 2;
            System.out.println(a);// 12
        };
        consumer.accept(10);

2.供给型接口

源码:

@FunctionalInterface
public interface Supplier<T> { 
   
    /** * Gets a result. * * @return a result */
    T get();
}

供给型接口提供一个给定参数类型的结果

举例:产生一些整数,并放入集合中

import java.util.function.Supplier;
 
public class Test { 
   
    public static void main(String[] args) { 
   
    		Test consumertest = new Test();
    		consumertest.getNumList(10,()->(int)(Math.random()*100));


    //产生一些整数,并放入集合中. int num 为产生的个数
  public List<Integer> getNumList(int num, Supplier<Integer> supplier) { 
   

        List<Integer> list = new ArrayList<>();

        for(int i = 0;i<num;i++) { 
   
			Integer n =supplier.get();
            list.add(n);
        }
        return list;
    }

3.函数型接口

Function接口接收一个参数,并返回单一的结果

举例:用于处理字符串


class Test{ 
   
	public static void main(String[] args){ 
   
		String newStr = strHandler("我是函数型接口",(str)->str.subString(2,5));
		System.out.println(newStr);
		}

public String strHandler(String str, Function<String,String> fun){ 
   
		return fun.apply(str);
}

4.段言型接口

Predicate接口是一个布尔类型的函数,该函数只有一个输入参数

举例1⃣️:
筛选出长度大于4的字符串,并放入新的集合中


class Test{ 
   
	public static void main(String[] args){ 
   
		List<String> list =Arrays.asList("Hello","World","Function","Lambda","Java");
		filterStr(list,(s) -> s.length()>4);
		System.out.println(newList);
}

public List<String> filterStr(List<String> list,Predicate<String> pre){ 
   
		List<String> newList = new ArrayList<>();

		for(String str : list){ 
   
			if(pre.test(str)){ 
   
				newList.add(str);
				}
			}
			return newList;
} 	

举例2⃣️:
自定义类,筛选出重量大于150kg的苹果

public class Apple { 
   
        private int weight;
        private String color;

        public Apple(int weight, String color) { 
   
            this.weight = weight;
            this.color = color;
        }

        public Integer getWeight() { 
   
            return weight;
        }

        public void setWeight(Integer weight) { 
   
            this.weight = weight;
        }

        public String getColor() { 
   
            return color;
        }

        public void setColor(String color) { 
   
            this.color = color;
        }

        public String toString() { 
   
            return "Apple{" +
                    "color='" + color + '\'' +
                    ", weight=" + weight +
                    '}';
        }
    }
public class FilteringApples1 { 
   
    public static void main(String[] args) { 
   
        List<Apple> inventory = Arrays.asList(
                 new FilteringApples1.Apple(80, "green"),
                new FilteringApples1.Apple(155, "green"),
                new FilteringApples1.Apple(120, "red"));

				filterApples(inventory, (a) -> a.getWeight() > 150);
				System.out.println(result);
}


public List<Apple> filterApples(List<Apple> inventory,Predicate<Apple> pre) { 
   
        List<Apple> result = new ArrayList<>();
        for (FilteringApples1.Apple apple : inventory) { 
   
            if (p.test(apple)) { 
   
                result.add(apple);
            }
        }
        return result;
    }

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127954.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mycat实现读写分离_mycat主从复制

    mycat实现读写分离_mycat主从复制1,课程回顾2,本章重点mysql主从原理,好处mycat概念,读写分离好处,读写分离的实现3,具体内容3.1mysql主从3.1.1linux下mysql安装以mysql5.6为例1)修改IP地址,修改主机名称vim/etc/sysconfig/network-scripts/ifcfg-ens33vim/etc/hostname2)安装mysql查看已经安装mysql组件:(centos6.9需要卸载原来的mysql

    2022年10月13日
  • C语言将int强制转换为char_C语言char数组长度

    C语言将int强制转换为char_C语言char数组长度今天遇到一个小陷阱。本来想看一个字符转成整型之后对应的值,结果竟意外的发现,转成的整型大于256。我:????字符不是只有一个字节么?我把这个字符的前后字符都置0,结果还是一样。我就懵逼了。一查才知道,和signedchar转成int的“潜规则”有关。原来,对于signedchar,将其转化为int时,最高位为符号位,那么扩展时,就会对符号位进行扩展,即将整型比字符多出来的位全部设置成与…

    2022年10月2日
  • 什么是SOAP,有哪些应用

    什么是SOAP,有哪些应用SOAP是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。SOAP利用XML技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。转载于:ht…

    2022年7月24日
  • 今天忙着画一个用例图,发现一个好用的工具图片_用例图画法

    今天忙着画一个用例图,发现一个好用的工具图片_用例图画法临时画用例图,Rose给卸载了,去网上查了查还真有在线制作的工具,推荐给大家ProcessOn(https://www.processon.com/)下面是我用它画的一幅用例图。

    2022年9月7日
  • TextCNN文本分类(keras实现)「建议收藏」

    TextCNN文本分类(keras实现)「建议收藏」目录前言:一、论文笔记二、Keras文本预处理1、读取数据集2、将文字转换成数字特征3、将每条文本转换为数字列表4、将每条文本设置为相同长度5、将每个词编码转换为词向量6、Keras文本预处理代码实现三、基于keras的TextCNN模型的构建、训练与测试1、基础版CNN(模仿LeNet-5)2、简单版TextCNN3、使用Word2Vec词向量…

    2022年6月28日
  • 基于特征的图像拼接算法_图像拼接算法原理

    基于特征的图像拼接算法_图像拼接算法原理目录APAP算法思路几个问题SVD在最小二乘中的应用DLT求单应性矩阵HMovingDLT求局部单应性矩阵实现的小细节文献图像拼接首先通过一些手段(标定、SIFT等特征点、其他传感器等)获取图像间的对应关系(2D-2D)。这个对应关系可以用单应性矩阵HHH(也称透视变换)描述[x′y′w′]=[h00h01h02h10h11h12h20h21h22][xyw]=H[xyw](1)\begin{aligned}\left[\begin{matrix}x’\\y’\\w’\end{matrix}\ri

    2022年9月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号