【不懂就问】java8新特性System.out::println是什么玩意。

兽兽 2021-05-11 07:04:34
接触java大半年,第一次看见这样的打印方式...

这是直接在forEach这个函数里面循环数组,并传入 打印的 方式吗

如果要返回 而不是打印,该怎么返回 请大佬指点
try (Stream<String> lines = Files.lines(filePath)){

List<String> filteredLines = lines
.filter(s -> s.contains("password"))
.collect(Collectors.toList());

filteredLines.forEach(System.out::println);

} catch (IOException e) {
e.printStackTrace();//只是测试用例,生产环境下不要这样做异常处理
}

...全文
1679 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈哈gogo 2021-05-17
  • 打赏
  • 举报
回复
filteredLines.forEach(System.out::println);
luj_1768 2021-05-16
  • 打赏
  • 举报
回复
是不是过去的Unix和Dos时代的古老技术?管道又回来了? 看标记方式,有些像管道(pipe line)。
biankobe24 2021-05-15
  • 打赏
  • 举报
回复
有点像匿名类
licip 2021-05-15
  • 打赏
  • 举报
回复
就是简化一下代码的书写吧。
starriesWEB 2021-05-15
  • 打赏
  • 举报
回复
你就这样理解 类::方法 循环中的参数,就是传给类中的方法 System.out.println(arg) System.out::println
得一以生 2021-05-14
  • 打赏
  • 举报
回复
我也很好奇,你要返回啥,你上一步都已经把数据过滤出来了,直接返回list不就好了吗 List<String> filteredLines = lines .filter(s -> s.contains("password")) .collect(Collectors.toList()); 直接返回这个filteredLines就行了呀
兽兽 2021-05-14
  • 打赏
  • 举报
回复
引用 18 楼 冰思雨 的回复:
System.out::println 这个是 函数引用 我们通常情况下,使用的是对象的引用, Java8 新增了 函数引用的概念,就是 函数也可以当做变量来使用了。 既然 函数引用 可以当做变量,那么,就可以当做参数进行传递了。 forEach 函数的参数,就是可以传递一个 函数引用,作用是 遍历集合中的每一个元素,都调用一次 参数传递进来的函数引用所指定的函数。 forEach(System.out::println); 中 System.out::println 作为回调函数,在 forEach 遍历每个元素时进行回调。 若要 返回 不进行打印的话,直接 return filteredLines; 即可,不要 filteredLines.forEach(System.out::println); 这行代码,直接用 return filteredLines; 替换。
谢谢,大佬, 学习了 函数也可以当做变量来使用
冰思雨 2021-05-14
  • 打赏
  • 举报
回复
System.out::println 这个是 函数引用 我们通常情况下,使用的是对象的引用, Java8 新增了 函数引用的概念,就是 函数也可以当做变量来使用了。 既然 函数引用 可以当做变量,那么,就可以当做参数进行传递了。 forEach 函数的参数,就是可以传递一个 函数引用,作用是 遍历集合中的每一个元素,都调用一次 参数传递进来的函数引用所指定的函数。 forEach(System.out::println); 中 System.out::println 作为回调函数,在 forEach 遍历每个元素时进行回调。 若要 返回 不进行打印的话,直接 return filteredLines; 即可,不要 filteredLines.forEach(System.out::println); 这行代码,直接用 return filteredLines; 替换。
nayi_224 2021-05-14
  • 打赏
  • 举报
回复
说了这么多也没见你把要返回什么说明白,不过有一个地方你很清醒,就是这就是个玩具。它的缺点很明显,修改和调试非常困难,而且功能有限,强行扩展功能只会让代码更难懂,论坛玩玩还好,实际项目中为何还要坚持用?
老王就是我 2021-05-14
  • 打赏
  • 举报
回复
相当于System.out.println(); System.out。这是一个类型,如果后面的方法不需要返回值的话可以——类型::方法名()。
=PNZ=BeijingL 2021-05-13
  • 打赏
  • 举报
回复
List 继承了 Iterable 可以使用forEach
default void forEach(Consumer<? super T> action) 签名中可以单到,参数是Consumer,其主要方法是 void accept(T t); 只有一个参数,没有返回值,即不能返回结果,
for (String str:list){
System.out.println(str);
}

可以写成
Consumer methodAndParam = a-> System.out.println(a);
list.forEach(a->methodAndParam.accept(a));
//或者
list.forEach(a->System.out.println(a));

Java 8 中可以通过 `::` 关键字来访问类的构造方法,对象方法,静态方法。
因为双冒号(::)运算符在Java 8中被用作方法引用

上面的再可以简写成: list.forEach(System.out::println);
xls丶 2021-05-13
  • 打赏
  • 举报
回复
引用 11 楼 兽兽 的回复:
[quote=引用 10 楼 KeepSayingNo 的回复:] filteredLines.forEach(System.out::println); 流式处理这样一行代码就解决了需要花好几行来写
这好是好 就是没法返回,只能打印,。。 重写forEach方法能返回吗。该怎么写呢[/quote] 你要返回啥?要返回就用list.stream().map()
qq_39936465 2021-05-12
  • 打赏
  • 举报
回复
引用 7 楼 兽兽 的回复:
[quote=引用 6 楼 maradona1984 的回复:]forEach方法你没法返回的,你真想循环过程中返回数据, 那就正常循环就好了,forEach仅仅是遍历 System.out::println 仅仅是个语法糖,::不同场景下的意义是不同的,编译期会根据上下文做推断,建议自行搜索学习下
这。。。合着这玩意,实际用的地方不多,几乎就是个玩具[/quote] 一般 x-> system.out.println(x) 可以简写为 system.out::println
兽兽 2021-05-12
  • 打赏
  • 举报
回复
引用 6 楼 maradona1984 的回复:
forEach方法你没法返回的,你真想循环过程中返回数据, 那就正常循环就好了,forEach仅仅是遍历 System.out::println 仅仅是个语法糖,::不同场景下的意义是不同的,编译期会根据上下文做推断,建议自行搜索学习下
这。。。合着这玩意,实际用的地方不多,几乎就是个玩具
maradona1984 2021-05-12
  • 打赏
  • 举报
回复
forEach方法你没法返回的,你真想循环过程中返回数据, 那就正常循环就好了,forEach仅仅是遍历 System.out::println 仅仅是个语法糖,::不同场景下的意义是不同的,编译期会根据上下文做推断,建议自行搜索学习下
兽兽 2021-05-12
  • 打赏
  • 举报
回复
https://cloud.tencent.com/developer/article/1488128 不知道是不是这个意思,看的头都大了,密密麻麻的
兽兽 2021-05-12
  • 打赏
  • 举报
回复
引用 3 楼 nayi_224 的回复:
[quote=引用 2 楼 兽兽 的回复:]好像System.out::println 只能和Stream 配套用吧,
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		aaa(System.out::println);
	}
	
	private static void aaa(Consumer a) {
		
	}
[/quote] 返回怎么返回啊 大佬
nayi_224 2021-05-12
  • 打赏
  • 举报
回复
引用 2 楼 兽兽 的回复:
好像System.out::println 只能和Stream 配套用吧,
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		aaa(System.out::println);
	}
	
	private static void aaa(Consumer a) {
		
	}
兽兽 2021-05-12
  • 打赏
  • 举报
回复
引用 10 楼 KeepSayingNo 的回复:
filteredLines.forEach(System.out::println); 流式处理这样一行代码就解决了需要花好几行来写
这好是好 就是没法返回,只能打印,。。 重写forEach方法能返回吗。该怎么写呢
KeepSayingNo 2021-05-12
  • 打赏
  • 举报
回复
filteredLines.forEach(System.out::println); 流式处理这样一行代码就解决了需要花好几行来写
加载更多回复(3)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧