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

总结

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

目录
相关文章
|
5月前
|
Java
解析Java线程池:参数详解与执行流程
解析Java线程池:参数详解与执行流程
58 1
|
4月前
|
Java API 编译器
Java编译器注解运行和自动生成代码问题之编译时通过参数设置选项值问题如何解决
Java编译器注解运行和自动生成代码问题之编译时通过参数设置选项值问题如何解决
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
41 0
|
23天前
|
存储 算法 Java
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
这篇文章是关于如何在Java中使用Graphics2D的RenderingHints方法来提高海报制作的图像质量和文字清晰度,包括抗锯齿和解决文字不清晰问题的技术详解。
30 0
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
|
29天前
|
Java
java构造方法时对象初始化,实例化,参数赋值
java构造方法时对象初始化,实例化,参数赋值
42 1
|
3月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
3月前
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
84 7
|
3月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
253 0
|
3月前
|
缓存 前端开发 Java
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
|
3月前
|
运维 监控 Java
【JVM 调优秘籍】实战指南:JVM 调优参数全解析,让 Java 应用程序性能飙升!
【8月更文挑战第24天】本文通过一个大型在线零售平台的例子,深入探讨了Java虚拟机(JVM)性能调优的关键技术。面对应用响应延迟的问题,文章详细介绍了几种常用的JVM参数调整策略,包括堆内存大小、年轻代配置、垃圾回收器的选择及日志记录等。通过具体实践(如设置`-Xms`, `-Xmx`, `-XX:NewRatio`, `-XX:+UseParallelGC`等),成功降低了高峰期的响应时间,提高了系统的整体性能与稳定性。案例展示了合理配置JVM参数的重要性及其对解决实际问题的有效性。
94 0