前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java8 :: 用法 (JDK8 双冒号用法)

java8 :: 用法 (JDK8 双冒号用法)

作者头像
张哥编程
发布于 2024-12-19 02:42:16
发布于 2024-12-19 02:42:16
9000
代码可运行
举报
文章被收录于专栏:云计算linux云计算linux
运行总次数:0
代码可运行

JDK8中有双冒号的用法,就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下。

代码其实很简单:

以前的代码一般是如此的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AcceptMethod {

    public static void  printValur(String str){
        System.out.println("print value : "+str);
    }

    public static void main(String[] args) {
        List<String> al = Arrays.asList("a","b","c","d");
        for (String a: al) {
            AcceptMethod.printValur(a);
        }
      //下面的for each循环和上面的循环是等价的 
        al.forEach(x->{
            AcceptMethod.printValur(x);
        });
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyTest {
    public static void  printValur(String str){
        System.out.println("print value : "+str);
    }

    public static void main(String[] args) {
        List<String> al = Arrays.asList("a", "b", "c", "d");
        al.forEach(AcceptMethod::printValur);
        //下面的方法和上面等价的
        Consumer<String> methodParam = AcceptMethod::printValur; //方法参数
        al.forEach(x -> methodParam.accept(x));//方法执行accept
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
上面的所有方法执行玩的结果都是如下:
1
2
3
4

print value : a
print value : b
print value : c
print value : d

  在JDK8中,接口Iterable 8中默认实现了forEach方法,调用了 JDK8中增加的接口Consumer内的accept方法,执行传入的方法参数。

JDK源码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

/**
     * Performs the given action for each element of the {@code Iterable}
     * until all elements have been processed or the action throws an
     * exception.  Unless otherwise specified by the implementing class,
     * actions are performed in the order of iteration (if an iteration order
     * is specified).  Exceptions thrown by the action are relayed to the
     * caller.
     *
     * @implSpec
     * <p>The default implementation behaves as if:
     * <pre>{@code
     *     for (T t : this)
     *         action.accept(t);
     * }</pre>
     *
     * @param action The action to be performed for each element
     * @throws NullPointerException if the specified action is null
     * @since 1.8
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

JDK8改动的,在接口里面可以有默认实现,就是在接口前加上default,实现这个接口的函数对于默认实现的方法可以不用再实现了。类似的还有static方法。现在这种接口除了上面提到的,还有BiConsumer,BiFunction,BinaryOperation等,在java.util.function包下的接口,大多数都有,后缀为Supplier的接口没有和别的少数接口。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
openJDK之lambda——List的forEach如何实现的
    openJDK的版本是openJDK8,如何下载openJDK,请参考我的这篇博客。
克虏伯
2019/04/15
6950
openJDK之lambda——List的forEach如何实现的
java8 函数式编程一
为什么要先从函数接口说起呢?因为我觉得这是 java8 函数式编程的入口呀!每个函数接口都带有 @FunctionalInterface 注释,有且仅有一个未实现的方法,表示接收 Lambda 表达式,它们存在的意义在于将代码块作为数据打包起来。
JMCui
2018/12/24
9580
震惊!Java8 出 Bug了?break 失效!return 等同于 continue?
今天又是开心撸码的一天!但是,在使用集合的 forEach() 方法时候,一个 Bug 刺醒了我!
一个正经的程序员
2022/07/20
5380
震惊!Java8 出 Bug了?break 失效!return 等同于 continue?
jdk8新特性之双冒号 :: 用法及详解
jdk8的新特性有很多,最亮眼的当属函数式编程的语法糖,本文主要讲解下双冒号::的用法。 概念 类名::方法名,相当于对这个方法闭包的引用,类似js中的一个function。比如: Function<String,String> func = String::toUpperCase; (Function在java.util.function包下,也是jdk8新加入的类,同级目录下有很多函数式编程模型接口,比如Consumer/Predicate/Operator等) func相当于一个入参和出参都为String的函数,可以直接 func.apply("abc") 接收一个参数,返回一个结果("ABC")。也可以用于代替下面的Lambda表达式: List<String> l = Arrays.asList("a","b","c"); l.stream().map(s -> s.toUpperCase()); l.stream().map(func); 下面自定义一个函数式接口 public class MyConsumer<String> implements Consumer<String> { @Override public void accept(String s) { System.out.println(s); } } 下面这俩种写法等价: List<String> l = Arrays.asList("a","b","c"); l.forEach(new MyConsumer<>()); l.forEach(s -> System.out.println(s)); 但是,这种写法却不行,编译失败: l.forEach(MyConsumer::accept); 因为MyConsumer的accept方法不是静态的,如果想使用这个方法,需要一个实例,还需要一个入参,共俩个参数。而List.forEach中需要的是consumer类型,相当于s -> {...},只有一个参数。 下面详细分析双冒号使用的各种情况 新建一个类,里面声明四个代表各种情况的方法: public class DoubleColon { public static void printStr(String str) { System.out.println("printStr : " + str); } public void toUpper(){ System.out.println("toUpper : " + this.toString()); } public void toLower(String str){ System.out.println("toLower : " + str); } public int toInt(String str){ System.out.println("toInt : " + str); return 1; } } 把它们用::提取为函数,再使用: Consumer<String> printStrConsumer = DoubleColon::printStr; printStrConsumer.accept("printStrConsumer"); Consumer<DoubleColon> toUpperConsumer = DoubleColon::toUpper; toUpperConsumer.accept(new DoubleColon()); BiConsumer<DoubleColon,String> toLowerConsumer = DoubleColon::toLower; toLowerConsumer.accept(new DoubleColon(),"toLowerConsumer"); BiFunction<DoubleColon,String,Integer> toIntFunction = DoubleColon::toInt; int i = toIntFunction.apply(new DoubleColon(),"toInt"); 非静态方法的第一个参数为被调用的对象,后面是入参。静态方法因为jvm已有对象,直接接收入参。 再写一个方法使用提取出来的函数: public class TestBiConsumer { public void test(BiConsumer<DoubleColon,String> consumer){ System.out.println("do s
良月柒
2019/03/19
2.8K0
试水jdk8 stream
Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是Stream API(java.util.stream.*)。
陈灬大灬海
2018/12/27
7380
Java 8 新特性|ForEach()方法
Java 8 为所有的集合添加了一个新的方法 forEach() ,该方法以只读形式遍历集合所有的元素并为每一个元素执行一个动作。
Java小技巧
2022/05/23
3170
Java源码系列(7):Java8的新特性
Lamdba表达式的本质是一个“语法糖”,由编译器推断并将我们转换包装为常规的代码,因此可以使用更少的代码来实现同样的功能。
陈琛
2020/06/12
4220
Java源码系列(7):Java8的新特性
java工程师要会的大数据之Stream流
在JDK8之前,Java是不⽀持函数式编程的,所谓的函数编程,即可理解是将⼀个函数(也称为“⾏ 为”)作为⼀个参数进⾏传递, ⾯向对象编程是对数据的抽象(各种各样的POJO类),⽽函数式编 程则是对⾏为的抽象(将⾏为作为⼀个参数进⾏传递
Joseph_青椒
2023/08/09
7800
JDK8新特性总结
Lambda表达式是一个新的语言特性,已经在JDK8中加入。它是一个可以传递的代码块,你也可以把它们当做方法参数。Lambda表达式允许您更紧凑地创建单虚方法接口(称为功能接口)的实例。
后端码匠
2019/09/02
1.2K0
迭代器 Iterator 接口源码分析
特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!
收心
2022/01/17
2920
海康威视一面:Iterator与Iterable有什么区别?
那天,小二去海康威视面试,面试官老王一上来就甩给了他一道面试题:请问 Iterator与Iterable有什么区别?小二差点笑出声,因为一年前,也就是 2021 年,他在《Java 程序员进阶之路》专栏上看到过这题😆。 PS:星标这种事,只能求,不求没效果,come on。《Java 程序员进阶之路》在 GitHub 上已经收获了 426 枚星标,小伙伴们赶紧去点点了,冲 500! https://github.com/itwanger/toBeBetterJavaer ---- 在 Java 中,我们对
沉默王二
2021/10/26
4160
海康威视一面:Iterator与Iterable有什么区别?
一文带你系统掌握JDK8新特性
JDK8是目前大部分公司中使用的Java开发版本,但是对于JDK8的一些新特性,即使一些入行一两年的小伙伴也未必掌握。由于笔者最近工作中用到了lambda表达式和stream流,于是就顺便写下这篇文章,希望对公众号的粉丝有一些帮助,也当作自己的学习笔记!
用户3587585
2022/09/21
4560
Java 集合(3)-- Iterable接口源码级别详解
iterable接口其实是java集合大家庭的最顶级的接口之一了,实现这个接口,可以视为拥有了获取迭代器的能力。Iterable接口出现在JDK1.5,那个时候只有iterator()方法,主要是定义了迭代集合内元素的规范。
秦怀杂货店
2020/11/19
3550
Java 集合(3)-- Iterable接口源码级别详解
JDK8新特性_JDK8面试题
要求:接口必须是函数式接口,一个接口如果只有一个抽象方法,那他就是函数式接口,我们可以在一个接口上使用__Functionallnterface__注解
全栈程序员站长
2022/09/21
1K0
带你彻底掌握 Lambda 表达式(上)
但平时在和很多小伙伴的交流和面试中,发现很多人仍停留在 JDK7 及以前的认知层面,Lambda 表达式、方法引用、Stream 流、default 关键字,很少使用,甚至还有不少小伙伴不知道怎么用!!
天之痕苏
2020/02/11
4550
带你彻底掌握 Lambda 表达式(上)
Java14 都来了,你还不会用 Java8吗?
Java 8 于2014年3月18日发布,并且成为主流的 Java,如今,虽然 Java 14 都已经发布了,但是 开发者和公司选择的版本依旧是经久不衰的 Java 8 版本,如果你还不了解这些新特性,是时候学习一下了。
代码宇宙
2023/02/23
3430
Java8新特性----Lambda表达式详细探讨
​ Lambda是一个匿名函数,可以理解为一段可以传递的代码(将代码像数据一样传递);可以写出更简洁、更灵活的代码;作为一种更紧凑的代码风格,是Java语言表达能力得到提升
大忽悠爱学习
2021/11/15
2870
JAVA8新特性
Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
用户10787181
2023/10/17
2340
JAVA8新特性
在Java8的Consumer中抛出异常
最近在实现公司内部一个通用svn数据工具类,其中有段代码是拿到当前更新后的数据进行下一步操作,用的是java8的Consumer实现的,代码如下:
Erwin
2021/03/04
4K1
JDK8 超详细,肝
Lambda表达式:依赖于函数式接口, 是对函数式接口的,另一种:实例化形式~👍 更简洁,难懂🙃
Java_慈祥
2024/08/06
2850
JDK8 超详细,肝
相关推荐
openJDK之lambda——List的forEach如何实现的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验