Java函数式编程:一种令人懵逼的技术,但是真的很好用

看代码:

if(new Predicate(){

@Override

public boolean test(Person person) {

return “男”.equals(person.sex);

}

}.test(jack)){

System.out.println(jack.name + “是男的!”);

}

如果这种Predicate对象其他方法也需要用怎么办?有一个技巧就是单独做一个方法,返回这种独有的Predicate对象。

/** 好耶!做成static任何地方想用就用啦! * */

public static Predicate PredicateBody (){

return new Predicate(){

@Override

public boolean test(Person person) {

return “男”.equals(person.sex);

}

};

}

然后是用的地方:

Person jack = new Person(“jack”,“男”);

if(PredicateBody().test(jack)){

System.out.println(jack.name + “是男的!”);

}

最后附上Predicate源码:

/*

  • Copyright © 2010, 2013, Oracle and/or its affiliates. All rights reserved.

  • ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.

*/

package java.util.function;

import java.util.Objects;

/**

  • Represents a predicate (boolean-valued function) of one argument.

  • This is a functional interface

  • whose functional method is {@link #test(Object)}.

  • @param the type of the input to the predicate

  • @since 1.8

*/

@FunctionalInterface

public interface Predicate {

/**

  • Evaluates this predicate on the given argument.

  • @param t the input argument

  • @return {@code true} if the input argument matches the predicate,

  • otherwise {@code false}

*/

boolean test(T t);

/**

  • Returns a composed predicate that represents a short-circuiting logical

  • AND of this predicate and another. When evaluating the composed

  • predicate, if this predicate is {@code false}, then the {@code other}

  • predicate is not evaluated.

  • Any exceptions thrown during evaluation of either predicate are relayed

  • to the caller; if evaluation of this predicate throws an exception, the

  • {@code other} predicate will not be evaluated.

  • @param other a predicate that will be logically-ANDed with this

  •          predicate
    
  • @return a composed predicate that represents the short-circuiting logical

  • AND of this predicate and the {@code other} predicate

  • @throws NullPointerException if other is null

*/

default Predicate and(Predicate<? super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) && other.test(t);

}

/**

  • Returns a predicate that represents the logical negation of this

  • predicate.

  • @return a predicate that represents the logical negation of this

  • predicate

*/

default Predicate negate() {

return (t) -> !test(t);

}

/**

  • Returns a composed predicate that represents a short-circuiting logical

  • OR of this predicate and another. When evaluating the composed

  • predicate, if this predicate is {@code true}, then the {@code other}

  • predicate is not evaluated.

  • Any exceptions thrown during evaluation of either predicate are relayed

  • to the caller; if evaluation of this predicate throws an exception, the

  • {@code other} predicate will not be evaluated.

  • @param other a predicate that will be logically-ORed with this

  •          predicate
    

必看视频!获取2024年最新Java开发全套学习资料 备注Java

@return a composed predicate that represents the short-circuiting logical

  • OR of this predicate and the {@code other} predicate

  • @throws NullPointerException if other is null

*/

default Predicate or(Predicate<? super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) || other.test(t);

}

/**

  • Returns a predicate that tests if two arguments are equal according

  • to {@link Objects#equals(Object, Object)}.

  • @param the type of arguments to the predicate

  • @param targetRef the object reference with which to compare for equality,

  •           which may be {@code null}
    
  • @return a predicate that tests if two arguments are equal according

  • to {@link Objects#equals(Object, Object)}

*/

static Predicate isEqual(Object targetRef) {

return (null == targetRef)

? Objects::isNull
object -> targetRef.equals(object);

}

}

Predicate自带的and方法怎么用?

=====================

看下源码:

default Predicate and(Predicate<? super T> other) {

Objects.requireNonNull(other);

return (t) -> test(t) && other.test(t);

}

意思就是加一个other的断言规则,返回的是自己(当前规则)和other规则判定的最终值(已经是一个布尔值了)之间的并集。

举个例子,一个person对象,我需要去判断他的name是否是jack,并且sex是否是男,代码如下。

Person jack = new Person(“jack”,“男”);

if(new Predicate(){

@Override

public boolean test(Person person) {

return “jack”.equals(person.name);

}

}.and(p -> “男”.equals(p.sex)).test(jack)){

System.out.println(jack.name + “是男的!”);

}else{

System.out.println(“判断出错!”);

}

以上代码可以得到预期的结果。

但是,相信很多人对and方法的源码已经看糊涂了,我这边再来点一点,其实刚才发生的事情就是这样:

Predicate p1 = new Predicate() {

@Override

public boolean test(Person person) {

return “jack”.equals(person.name);

}

};

Predicate p2 = t -> true && true;

&& 左右两边的条件必须都为true,结果才是true。

至于为什么能这样写,站长也觉得挺奇怪的,姑且就认为是Java8对lamda内部做的特别处理吧,有点像lamda的扩展语法。也就是说,lamda支持 “参数平移”,下面的这个例子,&&右边的逻辑相当于左边lamda的扩展,是一段用于参数 t 的 新逻辑。不得不说, 这真的很巧妙。

Person rose = new Person(“rose”,“女”);

Predicate isGirlAndRose = t -> “女”.equals(t.sex) && “rose”.equals(t.name);

if(isGirlAndRose.test(rose)){

System.out.println(“是rose!”);

}

函数式接口总结

=======

1.如果一个接口里面有且仅有一个未实现的方法,它就是函数式接口,你可以直接用lamda来完成new的操作。

2.如果一个方法的返回值是函数式接口,return的时候直接写个lamda即可。

3.如果参数是函数式接口,你可以直接写一个lamda,相当于传了一个匿名子类对象进去。

Lamda方法引用 ::(双冒号)

=================

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java的语言表达能力得到了提升。

方法引用 ::

=======

方法引用是什么 ?

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一

种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。

当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。

  • 作用

方法引用的唯一用途是支持Lambda的简写。

方法引用提高了代码的可读性,也使逻辑更加清晰。

  • 组成

使用::操作符将方法名和对象或类的名字分隔开。

“::” 是域操作符(也可以称作定界符、分隔符)。

静态方法引用


ClassName::staticMethod

实例方法引用


objectName::instanceMethod

构造方法引用(构造器引用)

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

g-blog.csdnimg.cn/img_convert/e76d4cb40751fe4b33a27e6d6dbc472c.png)

静态方法引用


ClassName::staticMethod

实例方法引用


objectName::instanceMethod

构造方法引用(构造器引用)

最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

道路是曲折的,前途是光明的!”

[外链图片转存中…(img-VczQRwtl-1716355722261)]

[外链图片转存中…(img-eGg1tohr-1716355722261)]

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java一种流行的编程语言,它不断发展,并在不断推出新的技术和工具。下面是一些最近在Java领域比较热门的技术: 1. Java SE 14:这是Java最新的标准版本,提供了许多新功能和改进,包括新的增强循环语句、新的字符串方法、新的操作符、更好的性能和更多的安全性。 2. JavaFX 14:这是一个用于创建图形用户界面的Java库,最近发布了新版本,包括了许多新的功能和改进。 3. Spring Boot 2.4:这是一个用于构建Java应用程序的框架,它最近发布了新版本,包括了许多新的功能和改进,比如更好的性能、更好的安全性、更多的灵活性等。 4. Kotlin:这是一种兼容Java的编程语言,它有许多优秀的特性,如简洁的语法、类型安全、空指针安全等,越来越多的开发者选择使用Kotlin来替代Java。 5. JUnit 5:这是一个流行的Java单元测试框架,最近发布了新版本,包括了许多新的功能和改进,比如更好的可扩展性、更好的性能、更多的选项等。 这只是Java领域的一些 ### 回答2: 当前Java技术不断发展,涌现出了许多新技术。以下是一些重要的Java相关新技术: 1. Java 8新特性:引入了lambda表达式、函数式接口、默认方法、Stream API等功能,提升了语言的表达能力和编程效率。 2. Java 9模块化系统:引入了Java平台模块系统(Java Platform Module System,JPMS),可以将代码组织为更小、更可重用的模块,并提供更加灵活的依赖管理和安全性。 3. Java 11的长期支持(LTS):Java 11是自Java 8以来的下一个长期支持版本,提供更强大、更稳定和更安全的功能,包括HTTP/2支持、响应式编程、强化的垃圾回收等。 4. Java 14的新特性:引入了Pattern Matching for instanceof、Switch表达式、Records等特性,简化了代码编写和重构。 5. 编译器的改进:例如GraalVM,它是一个高性能、通用的JVM和编译器,可以提供更好的性能和更低的内存消耗。 6. Java虚拟机性能和监控工具的发展:例如Java Mission Control和VisualVM,它们提供了更好的性能分析、故障诊断和监控功能,帮助开发人员优化代码和调优应用程序。 7. Spring Boot框架:它是一个快速开发和部署Java应用程序的框架,并提供了多个功能模块和自动配置,简化了传统Java开发的繁琐流程。 8. Kotlin语言:虽然不是Java的新技术,但Kotlin已经成为Java开发的重要选择。Kotlin是一种现代化、类型安全、简洁且与Java兼容的编程语言,广泛地用于Android开发和后端应用程序开发。 总而言之,Java相关的新技术包括语言的新特性、模块化系统、编译器的改进、虚拟机性能工具、框架的进步和新的编程语言选择等。这些新技术Java开发人员提供了更多的选择和优化性能的机会。 ### 回答3: Java作为一门广泛应用的编程语言,不断发展并引入了许多新的技术。以下是一些与Java相关的新技术: 1. Kotlin:Kotlin是一种基于Java虚拟机(JVM)的静态类型编程语言。它与Java代码兼容且易于学习,同时提供了更简洁、安全和高效的代码编写方式。 2. Java模块系统(Java 9):Java 9引入了一个新的模块化系统,称为Java平台模块系统(JPMS)。这种模块化系统可以帮助开发者更好地管理和组织代码库,并提供更好的封装和代码重用性。 3. Spring Boot:Spring Boot是一个用于快速开发基于Spring框架的应用程序的开发工具。它提供了约定大于配置的原则,自动配置和快速构建应用程序的能力,简化了Java应用程序的开发流程。 4. Java回收系统的改进(Java 11):Java 11引入了称为Epsilon的新的垃圾回收器。它是一种“无操作”回收器,适用于那些不会产生实际垃圾情况的特定应用程序,以提高应用程序的性能。 5. Quarkus:Quarkus是一种新兴的Java框架,旨在为云原生应用提供更好的开发和运行时性能。它通过提供更快的启动时间、较低的内存消耗和更高的可扩展性来优化Java应用的性能。 6. Java内存区域的改进(Java 14):Java 14引入了称为“异步状态加载”(Async State Loading)的新特性,以改善Java虚拟机的内存管理和性能。 总之,随着技术的不断发展,Java也在不断更新和引入新的技术,以提供更好的开发体验和应用性能。以上列举的只是其中的一些例子,还有许多其他令人兴奋的Java相关新技术

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值