【不懂就问】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();//只是测试用例,生产环境下不要这样做异常处理
}

...全文
1133 1 收藏 24
写回复
24 条回复
filteredLines.forEach(System.out::println);
回复 点赞
aaaak_ 05月17日
Java 8 中我们可以通过 `::` 关键字来访问类的构造方法,对象方法,静态方法。 '::' 来访问类 类中的方法呢?先定义一个接口 @FunctionalInterface interface IConvert<F, T> { T convert(F form); } --------------------------- 然后通过 IConvert<String, String> convert = xxxClass::xxMethod ; convert..convert("abcd");
回复 点赞
luj_1768 05月16日
是不是过去的Unix和Dos时代的古老技术?管道又回来了? 看标记方式,有些像管道(pipe line)。
回复 点赞
biankobe24 05月15日
有点像匿名类
回复 点赞
licip 05月15日
就是简化一下代码的书写吧。
回复 点赞
starriesWEB 05月15日
你就这样理解 类::方法 循环中的参数,就是传给类中的方法 System.out.println(arg) System.out::println
回复 点赞
得一以生 05月14日
我也很好奇,你要返回啥,你上一步都已经把数据过滤出来了,直接返回list不就好了吗 List<String> filteredLines = lines .filter(s -> s.contains("password")) .collect(Collectors.toList()); 直接返回这个filteredLines就行了呀
回复 点赞
兽兽 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; 替换。
谢谢,大佬, 学习了 函数也可以当做变量来使用
回复 点赞
冰思雨 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 05月14日
说了这么多也没见你把要返回什么说明白,不过有一个地方你很清醒,就是这就是个玩具。它的缺点很明显,修改和调试非常困难,而且功能有限,强行扩展功能只会让代码更难懂,论坛玩玩还好,实际项目中为何还要坚持用?
回复 点赞
老王就是我 05月14日
相当于System.out.println(); System.out。这是一个类型,如果后面的方法不需要返回值的话可以——类型::方法名()。
回复 点赞
=PNZ=BeijingL 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丶 05月13日
引用 11 楼 兽兽 的回复:
[quote=引用 10 楼 KeepSayingNo 的回复:] filteredLines.forEach(System.out::println); 流式处理这样一行代码就解决了需要花好几行来写
这好是好 就是没法返回,只能打印,。。 重写forEach方法能返回吗。该怎么写呢[/quote] 你要返回啥?要返回就用list.stream().map()
回复 点赞
qq_39936465 05月12日
引用 7 楼 兽兽 的回复:
[quote=引用 6 楼 maradona1984 的回复:]forEach方法你没法返回的,你真想循环过程中返回数据, 那就正常循环就好了,forEach仅仅是遍历 System.out::println 仅仅是个语法糖,::不同场景下的意义是不同的,编译期会根据上下文做推断,建议自行搜索学习下
这。。。合着这玩意,实际用的地方不多,几乎就是个玩具[/quote] 一般 x-> system.out.println(x) 可以简写为 system.out::println
回复 点赞
兽兽 05月12日
引用 6 楼 maradona1984 的回复:
forEach方法你没法返回的,你真想循环过程中返回数据, 那就正常循环就好了,forEach仅仅是遍历 System.out::println 仅仅是个语法糖,::不同场景下的意义是不同的,编译期会根据上下文做推断,建议自行搜索学习下
这。。。合着这玩意,实际用的地方不多,几乎就是个玩具
回复 点赞
maradona1984 05月12日
forEach方法你没法返回的,你真想循环过程中返回数据, 那就正常循环就好了,forEach仅仅是遍历 System.out::println 仅仅是个语法糖,::不同场景下的意义是不同的,编译期会根据上下文做推断,建议自行搜索学习下
回复 点赞
兽兽 05月12日
https://cloud.tencent.com/developer/article/1488128 不知道是不是这个意思,看的头都大了,密密麻麻的
回复 点赞
兽兽 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 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) {
		
	}
回复 点赞
兽兽 05月12日
引用 10 楼 KeepSayingNo 的回复:
filteredLines.forEach(System.out::println); 流式处理这样一行代码就解决了需要花好几行来写
这好是好 就是没法返回,只能打印,。。 重写forEach方法能返回吗。该怎么写呢
回复 点赞
发动态
发帖子
Web 开发
创建于2007-09-28

5.2w+

社区成员

34.1w+

社区内容

Java Web 开发
社区公告
暂无公告