澳门网络娱乐游戏平台-澳门电子游戏娱乐网址-官方直营

澳门博彩业控股Java8之Stream类

13.1常用的函数式接口总括

 

接口名称 方法名称 抽象/默认  延迟/终结 方法描述
Supplier get 抽象 终结 供给型接口,无参有返回值,主要用于
Consumer accept 抽象 终结 消费型接口,有参数无返回值
  andThen 默认 延迟  
Function apply 抽象 终结 函数型接口,有参数有返回值
  andThen 默认 延迟  
  compose 默认 延迟  
Predicate test 抽象 终结 断言型接口,元芳你怎么看
  and 默认 延迟  
  or 默认 延迟  
  negate 默认 延迟  

澳门博彩业控股Java8之Stream类。notes:

12.1  函数式接口

 

12.1.1 概念

style="font-size: 1.167rem; line-height: 31.7424px;">1.函数式接口在Java中是指:有且独有三个虚无方法的接口。

style="font-size: 1.167rem; line-height: 31.7424px;">2.函数式接口,即适用于函数式编制程序场景的接口,而Java中的函数式编制程序显示就是拉姆da,全数函数式接口即是足以适用于Lamnda使用的接口,独有保障接口中有且只有三个虚幻方法,java中的Lambda技术顺风地扩充推导。

style="font-size: 1.167rem; line-height: 31.7424px;">3、语法糖的定义:是指派用进一层惠及,可是原理不改变的代码语法,譬喻在遍历集适当时候接纳的for-each语法,其实底层的完毕原理 仍是迭代器,那正是语法糖,从利用层讲, java中的Lambda能够被看做是无名内部类的语法糖,不过两岸原理上分化的

style="font-size: 1.167rem;">4.复习在此之前Lambda的应用须要,使用原则1:必需具备函数式接口,(java语言中早就提供了众多函数式接口)

                                                     使用原则2:调用的艺术必需具有函数式接口作为艺术的参数,(Java语言已经提供了不菲主意,这几个方法的参数都是函数式接口)

 

12.1.2 格式

style="font-size: 1.167rem;">只要确定保证接口中有且独有二个虚幻方法就能够

修饰符 interface 接口名称 {
    public abstract 返回值类型 方法名称(可选参数信息);
    // 其他非抽象方法内容
}

 

 

 

4

 

 

 

 

 

1

修饰符 interface 接口名称 {

2

    public abstract 返回值类型 方法名称(可选参数信息);

3

    // 其他非抽象方法内容

4

}

 

 

style="font-size: 1.167rem;">由于接口个中抽象方法的public abstract是能够简简单单的,所以定义一个函数式接口很简短:

public interface MyFunctionalInterface { 
 void myMethod();
}

 

 

 

3

 

 

 

 

 

1

public interface MyFunctionalInterface {

2

void myMethod();

3

}

 

 

 

12.1.3 @FunctionalInterface注解

style="font-size: 1.167rem;">与@Override表明的效应形似,Java 第88中学等职业学园门为函数式接口引进了二个新的注释:@FunctionalInterface。该阐明可用来三个接口的概念上:

// 函数式接口注解 : 该接口仅能拥有一个抽象方法
@FunctionalInterface
public interface MyFunctionalInterface {

    // 抽象方法定义 :
    void myMethod();
}

 

 

 

7

 

 

 

 

 

1

// 函数式接口注解 : 该接口仅能拥有一个抽象方法

2

@FunctionalInterface

3

public interface MyFunctionalInterface {

4

5

    // 抽象方法定义 :

6

    void myMethod();

7

}

 

 

notes:如若接纳该评释来定义接口,编写翻译器将会强逼检查该接口是或不是真的有且唯有一个浮泛方法,否则将会报错。供给介怀的是,纵然不行使该证明,只要满意函数式接口的概念,那依然是一个函数式接口,使用起来都同生龙活虎。

 

生龙活虎. 二种最大旨的函数式接口


动用Stream类举办流操作以前,先精通一下多样最基本的函数式接口(依据法文单词意思就能够通晓其效能):

  1. Predicate<T> 接口:三个T类型参数,再次来到boolean类型值。
    boolean test(T t);
    Lambda表明式基本写法:
    Predicate<Integer> predicate = x -> x > 5;
  2. Function<T, 中华V> 功能接口:叁个T类型参数,重回ENCORE类型值。
    R apply(T t);
    Lambda表明式基本写法:
    Function<Integer, Integer> function = x -> x + 1;
  3. Supplier<T> 接口:无参数,重临三个T类型值。
    T get();
    Lambda表明式基本写法:
    Supplier<Integer> supplier = () -> 1;
  4. Consumer<T> 接口:四个T类型参数,无再次来到值。
    void accept(T t);
    拉姆da说明式基本写法:
    Consumer<Integer> consumer = x -> System.out.println(x);
    Consumer<Integer> consumer = System.out::println;//方法引用的写法

“->”符号的左臂对应的是方式参数,无参数就空括号,叁个参数能够省略括号,多参数不能够大概,举例(x,y卡塔尔国;
“->”符号的侧边对应的是措施再次来到值,全部是二个代码块{...},最后重返值对应措施就可以。比如Function<Integer, Integer> function = x -> {return x + 1};当独有二个表达式时,{}、return均可粗略。
以上函数式接口的架空方法都以单个参数,三个参数有BiPredicate、BiFunction、BiConsumer等接口,用法近似。

Optional 不是函数是类,那是个用来严防NullPointerException的援助项目。T get(卡塔尔(قطر‎

       

推迟措施:只是在拼接Lambda函数模型的格局,并不如时奉行拿到结果。

        - 终结方法:遵照拼好的Lambda函数模型,立时实行获得结果值的主意。

 

12.2  函数式编程

 

 

  12.2.1 拉姆da 的延时进行

            某个场景的代码施行后,结果不必然会被选择,进而诱致品质浪费。而Lambda表达式是延迟实践的,那刚刚能够看做消除方案,提高质量。

   质量浪费的日记案例:

             生机勃勃种标准的景色便是对参数实行有标准使用,比方对日记消息举行拼接后,在满意条件的情景下开展打字与印刷输出:

    public static void main(String[] args) {

        String s1 = "Hello";
        String s2 = "World";
        String s3 = "Java";

        // 调用方法
        log(0, s1 + s2 + s3);
    }

    // 方法 :
    public static void log(int level, String msg) {
        if (level == 1) {
            System.out.println(msg);
        }
    }

结果: 
    说明 : 如果 level 不为 1, 则没有任何输出结果.
    说明 : 如果 level 为 1, 输出结果如下 :
    HelloWorldJava

 

 

 

21

 

 

 

 

 

1

    public static void main(String[] args) {

2

3

        String s1 = "Hello";

4

        String s2 = "World";

5

        String s3 = "Java";

6

7

        // 调用方法

8

        log(0, s1 + s2 + s3);

9

    }

10

11

    // 方法 :

12

    public static void log(int level, String msg) {

13

        if (level == 1) {

14

            System.out.println(msg);

15

        }

16

    }

17

18

结果: 

19

    说明 : 如果 level 不为 1, 则没有任何输出结果.

20

    说明 : 如果 level 为 1, 输出结果如下 :

21

    HelloWorldJava

 

 

style="font-size: 1.167rem;">notes:这段代码存在难点:无论等级是或不是知足必要,作为log方法的第贰个参数,多少个字符串一定会首先被拼接并传播方法内,然后才博览会开等级决断。假使品级不相符必要,那么字符串的拼凑操作就白做了,存在质量浪费。

 

style="font-size: 1.167rem;">体验Lambda的优化写法

style="font-size: 1.167rem;">使用Lambda必然要求三个函数式接口:

@FunctionalInterface
public interface MessageBuilder {

    // 抽象方法
    String buildMsg();
}

 

 

 

6

 

 

 

 

 

1

@FunctionalInterface

2

public interface MessageBuilder {

3

4

    // 抽象方法

5

    String buildMsg();

6

}

 

 

style="font-size: 1.167rem;">然后对log方法举办改建

    public static void main(String[] args) {

        String s1 = "Hello";
        String s2 = "World";
        String s3 = "Java";

        // 调用方法 :
        log(1, () -> s1 + s2 + s3);
    }

    // 方法 :
    public static void log(int level, MessageBuilder messageBuilder) {
        if (level == 1) {
            String result = messageBuilder.buildMsg();
            System.out.println("result = " + result);
        }
    }


输出结果 :
result = HelloWorldJava

 

 

 

21

澳门博彩业控股, 

 

 

 

 

1

    public static void main(String[] args) {

2

3

        String s1 = "Hello";

4

        String s2 = "World";

5

        String s3 = "Java";

6

7

        // 调用方法 :

8

        log(1, () -> s1 + s2 + s3);

9

    }

10

11

    // 方法 :

12

    public static void log(int level, MessageBuilder messageBuilder) {

13

        if (level == 1) {

14

            String result = messageBuilder.buildMsg();

15

            System.out.println("result = " + result);

16

        }

17

    }

18

19

20

输出结果 :

21

result = HelloWorldJava

 

 

style="font-size: 1.167rem;">新澳门mg游戏大平台,noets:那样一来,独有当等级满足供给的时候,才会开展多少个字符串的拼接;不然四个字符串将不博览会开拼接

style="font-size: 1.167rem;">从结果中能够看见,在不符合等第供给的气象下,Lambda将不会执行。进而到达节省质量的法力。

 

style="font-size: 1.167rem;">扩展:实际上选用在那之中类也能够完毕同等的职能,只是将代码操作延迟到了此外贰个目的当中通过调用方法来达成。而是或不是调用其所在艺术是在尺度剖断之后才施行的。

style="font-size: 1.167rem;"> style="background-color: #ffff00;">除却Lambda还可视作参数和再次来到值

 

二. 使用Stream类实行流操作


上面开端选取Stream类实行流操作,除了Stream类,还应该有IntStream、DoubleStream、LongStream,很明显这二种都以有针对性的流操作,分别针对int、double、long类型的数据,它们都继承BaseStream类,如下图所示:

新澳门mg游戏大平台 1

继续关系图.png

本文由澳门网络娱乐游戏平台发布于编程,转载请注明出处:澳门博彩业控股Java8之Stream类

相关阅读