【拾遗】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表达式。

总结

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

目录
相关文章
|
26天前
|
Java API 编译器
Java编译器注解运行和自动生成代码问题之编译时通过参数设置选项值问题如何解决
Java编译器注解运行和自动生成代码问题之编译时通过参数设置选项值问题如何解决
|
2月前
|
Java
解析Java线程池:参数详解与执行流程
解析Java线程池:参数详解与执行流程
35 1
|
1月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
17 0
|
9天前
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
37 7
|
22天前
|
存储 Java
java 服务 JVM 参数设置配置
java 服务 JVM 参数设置配置
23 3
|
3天前
|
Java 编译器 数据库连接
Java中的无参数构造方法
Java中的无参数构造方法
|
26天前
|
Java 测试技术 Maven
Java编译器注解运行和自动生成代码问题之在编译时需要设置-proc:none参数问题如何解决
Java编译器注解运行和自动生成代码问题之在编译时需要设置-proc:none参数问题如何解决
|
8天前
|
Java
JAVA 获取 URL 指定参数的值
JAVA 获取 URL 指定参数的值
15 0
|
2月前
|
Java 编译器
Java中可变长参数的使用代码和方法
Java中可变长参数的使用代码和方法
28 7
|
2月前
|
Java 编译器
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
Java健壮性 Java可移植性 JDK, JRE, JVM三者关系 Java的加载与执行原理 javac编译与JAVA_HOME环境变量介绍 Java中的注释与缩进 main方法的args参数
34 1