栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

376-383 常用函数式接口

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

376-383 常用函数式接口

376 常用函数式接口:Supplier

预定义

Java8在java.util.function包下预定义了大量的函数式接口,这里重点学习4个:

Supplier

Consumer

Predicate

Function

【Supplier】

被称为生产型接口,主要用于提供结果。

包含1个get方法,返回<>泛型。该方法不需要参数,它会按某种逻辑(由LambDa实现)返回一个<>数据。如果指定了接口泛型,get方法就会返回什么类型的数据。

【练习需求】

定义一个String getString(Supplier sub)方法,返回数据

---------------------------------------------

package e376aso;

import java.util.function.Supplier;

public class Demo376 {

    public static void main(String[] args) {

        System.out.println(getString(() -> "mole"));

        System.out.println(getInteger(() -> 3));

//        why nothing in the () of parameter

    }

    private static String getString(Supplier su) {

        return su.get();

    }

    private static int getInteger(Supplier suu) {

//        返回值写int是可以的,这里可以自动拆箱装箱

        return suu.get();

    }

}

//what the meaning of the two method? why i need them?

//mole

//3

377 Supplier练习:获取最大值

378 常用函数式接口:Consumer

Consumer被称为消费性接口,它消费的数据的类型由泛型指定

interface Consumer表示接受单个输入参数且 不返回结果的操作。与大多数其他功能接口不同,Consumer预期通过副作用进行操作。

包含2个方法:

(1个抽象方法,1个默认方法)

void accept(T t),对给定的参数执行此操作

default Consumer andThen(Consumer after),返回一个组成的Consumer,依次执行此操作,然后执行after操作

【练习需求】

定义一个方法,消费1个字符串数据

定义一个方法,消费2个字符串数据

---------------------------------------------

package e376aso;

import java.util.function.Consumer;

public class Demo378Consumer {

    public static void main(String[] args) {

        operateString("morning", ss -> System.out.println(ss));

        operateString("abc", ss -> System.out.println(new StringBuilder(ss).reverse().toString()));

        operateString("noon", System.out::println);

        System.out.println(1);

        operateStrings("xyz", sss -> System.out.println(sss), ssss -> System.out.println(new StringBuilder(ssss).reverse().toString()));

    }

    private static void operateString(String str, Consumer con) {

        con.accept(str);

    }

//定义一个方法,消费1个字符串数据2次

    private static void operateStrings(String str, Consumer con1, Consumer con2) {

//        con1.accept(str);

//        con2.accept(str);

        con1.andThen(con2).accept(str);

    }

}

//morning

//cba

//noon

//1

//xyz

//zyx

379 Consumer练习:按要求打印信息

380 常用函数式接口:Predicate(1)

Predicate,美 [ˈpredɪkət , ˈpredɪkeɪt] 

n.谓语(句子成分,对主语加以陈述,如John went home中的went home)

vt.断言;使基于;使以…为依据;表明;阐明

变量和类型

方法

1

default Predicate

and(Predicateother)

AND,返回一个组合谓词,表示此谓词和另一个谓词的短路逻辑AND。

2

staticPredicate

isEqual(Object target R e f)

==,返回一个谓词,根据Objects.equals(Object,Object)测试两个参数是否相等。

3

default Predicate

negate()

NOT返回表示此谓词的逻辑否定的谓词。

4

staticPredicate

not(Predicatetarget)

UN,返回谓词,该谓词是提供的谓词的否定。

5

default Predicate

or(Predicateother)

OR,返回一个组合谓词,表示此谓词与另一个谓词的短路逻辑OR。

6

boolean

test(T t)

根据给定的参数计算此谓词。

7

Predicate

判断参数是否满足指定的条件

【代码思路】

定义一个private static boolean checkString(String s,Predicate pre)方法并调用。

(方法体里面调用test方法,没有其他代码)

【梳理】

test到底做了什么,要看Java预定义的代码,不是自己写的。话说早了,是自己写的,在调用时写。可是,main方法里写好一切不好吗,为什么要定义一个方法然后调用绕来绕去?

最近的练习的方法多是private的啊,为什么?

---------------------------------------------

package e376aso;

import java.util.function.Predicate;

public class Demo380Predicate {

    public static void main(String[] args) {

        boolean b1 = checkString1("hello", ss -> ss.length() < 8);

        boolean b2 = checkString2("hello", ss -> ss.length() < 8);

        boolean b3 = checkString2("hello", ss -> ss.length() < 8);

        System.out.println(b1 + "," + b2 + "," + b3);

    }

    private static boolean checkString1(String str, Predicate pre) {

        return pre.test(str);

    }

    private static boolean checkString2(String str, Predicate pre) {

        return !pre.test(str);

    }

    private static boolean checkString3(String str, Predicate pre) {

        return pre.negate().test(str);

    }

}

//true,false,false

381 常用函数式接口:Predicate(2)

【练习需求】

1个字符串,2个判断条件,以2个判断结果为算子,输出运算结果

---------------------------------------------

package e376aso;

import java.util.function.Predicate;

public class Demo381Predicate2 {

    public static void main(String[] args) {

        boolean b44 = checkString44("hello", str1 -> str1.length() < 8, str2 -> str2.length() > 8);

        boolean b55 = checkString55("hello", str1 -> str1.length() < 8, str2 -> str2.length() > 8);

        System.out.println(b44 + "," + b55);

    }

    private static boolean checkString44(String str, Predicate pre1, Predicate pre2) {

//        boolean boo1 = pre1.test(str);

//        boolean boo2 = pre2.test(str);

//        return boo1 && boo2;

        return pre1.and(pre2).test(str);

    }

    private static boolean checkString55(String str, Predicate pre1, Predicate pre2) {

        return pre1.or(pre2).test(str);

    }

}

//false

382 Predicate练习:筛选满足条件数据

383 常用函数式接口:Function

软件包  java.util.function Interface Function

T - 函数输入的类型

R - 函数结果的类型

这是一个功能接口,因此可以用作lambda表达式或方法引用的赋值目标。

@FunctionalInterface

public interface Function表示接受一个参数并生成结果的函数。

这是一个functional interface,其功能方法是apply(Object) 。

1

R apply(T t)

将此函数应用于指定的参数

2

default Function andThen(Function after)

andThen(Function after)

返回组合函数,首先将该函数应用于输入,然后将after函数应用于结果

3

Function接口通常用于对参数进行处理,处理逻辑由LambDa表达式实现,然后返回一个新的值

【练习需求】

定义一个方法,把String数据转为int数据

定义一个方法,把int数据加上一个整数后转为String数据

定义一个方法,把String数据转为int数据,加上一个整数后转为String

---------------------------------------------

package e376aso;

import java.util.function.Function;

public class Demo383Function {

    public static void main(String[] args) {

        System.out.println(convert("99", s -> Integer.parseInt(s)));

        System.out.println(convert("99", Integer::parseInt));

        System.out.println(convert(98, i -> String.valueOf(i + 2)));

        convert("88", s -> Integer.parseInt(s), i -> String.valueOf(i + 1));

//        方法有返回值,可作为sout的参数调用并写屏。方法无返回值,则方法体中应以sout输出。sout在main中or方法体中,要写屏,必居其一。

    }

    private static int convert(String s, Function fuu) {

        return fuu.apply(s);

    }

    private static String convert(int i, Function fuu) {

        return fuu.apply(i);

    }

    private static void convert(String s, Function fuu1, Function fuu2) {

        Integer ii = fuu1.apply(s);

        String ss = fuu2.apply(ii);

        System.out.println("1." + ss);

        System.out.println("2." + fuu2.apply(fuu1.apply(s)));

        System.out.println("3." + fuu1.andThen(fuu2).apply(s));

        ;

    }

}

//99

//99

//100

//1.89

//2.89

//3.89

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号