【拾遗】Java中的隐式参数

简介: 今天翻《Java 8 编程参考官方教程》的时候看到一段代码:public class InstanceMethWithObjectRefDemo { private static int counter(T[] vals, MyFunc f...

今天翻《Java 8 编程参考官方教程》的时候看到一段代码:

public class InstanceMethWithObjectRefDemo {
    private static <T> int counter(T[] vals, MyFunc<T> f, T v2) {
        int count = 0;
        
        for (T v1 : vals) {
            if (f.func(v1, v2)) count++;
        }
        
        return count;
    }
    
    
    public static void main(String[] args) {
        int count;
        
        HighTemp[] weekDayHighs = {
                                    new HighTemp(89), new HighTemp(82),new HighTemp(90), new HighTemp(89),  
                                    new HighTemp(89), new HighTemp(91),new HighTemp(84), new HighTemp(83) 
                                    };
        
        count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));
        
        System.out.println(count + " days had a high of 89");
        
        count = counter(weekDayHighs, HighTemp::lessThanTemp, new HighTemp(89));

        System.out.println(count + " days had a high less than of 89");
    }
}

@FunctionalInterface
interface MyFunc<T> {
    boolean func(T v1, T v2);
}

class HighTemp {
    private int hTemp;

    public HighTemp(int hTemp) {
        this.hTemp = hTemp;
    }

    boolean sameTemp(HighTemp ht2) {
        return this.hTemp == ht2.hTemp;
    }

    boolean lessThanTemp(HighTemp ht2) {
        return this.hTemp < ht2.hTemp;
    }
}

这里有一段:

count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));

看到的时候有点疑问,HighTemp#sameTemp怎么就和MyFunc函数式接口兼容了呢?MyFunc需要两个T参数和一个boolean返回值。而HighTemp#sameTemp是一个参数一个返回值。愣了一会儿,想起隐式参数这回事,恍然大悟。
一般情况下方法都会有superthis,所以相当于sameTemp方法的声明是:

boolean sameTemp(HighTemp this, HighTemp ht2);

这样就和MyFunc兼容了。

接口中唯一抽象方法的命名并不重要,因为函数式接口就是对某一行为进行抽象,主要目的就是支持Lambda表达式。

总结

有些知识点看的时候理解,但不到实际应用,还真容易忘,但是看过的东西总比没有学习过要好,因为在你需要它的时候,你能想起来,帮助你解决问题。

目录
相关文章
|
4天前
|
存储 Java
Java-参数传值
Java-参数传值
25 4
|
4天前
|
Java
【Java每日一题】— —第二十二题:类名作参数进行方法调用的传递问题。
【Java每日一题】— —第二十二题:类名作参数进行方法调用的传递问题。
31 1
|
4天前
|
前端开发 Java 数据库连接
9:参数校验-Java Spring
9:参数校验-Java Spring
34 0
|
4天前
|
存储 Java fastjson
Java泛型-4(类型擦除后如何获取泛型参数)
Java泛型-4(类型擦除后如何获取泛型参数)
33 1
|
4天前
|
XML 存储 Java
11:Servlet中初始化参数的获取与应用-Java Web
11:Servlet中初始化参数的获取与应用-Java Web
27 3
|
4天前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
23 0
|
4天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
92 0
|
3天前
|
Java Kotlin
关于Java:public函数公开其public / * package * /’参数类型
关于Java:public函数公开其public / * package * /’参数类型
10 3
|
4天前
|
Java 编译器 C语言
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
13 3
|
4天前
|
存储 Java 测试技术
一文搞清楚Java中的方法、常量、变量、参数
在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:**常量与变量**,我们在数学和物理学中已经接触过变量的概念了,在Java中的变量就是在程序运行过程中可以改变其值的量。
20 0