Java 映射与函数接口关联的管道运算符
我不明白为什么Java 映射与函数接口关联的管道运算符,java,java-8,functional-programming,java-stream,mapping,Java,Java 8,Functional Programming,Java Stream,Mapping,我不明白为什么String::toUpperCase()表达式在流map管道中运行良好。当我在这里看这个例子时: Stream.of("test1", "test2", "test3", "test4") .filter(s -> s.contains("r")) .map(s -> s + "map") .map(String::toUpperCase)
String::toUpperCase()
表达式在流map
管道中运行良好。当我在这里看这个例子时:
Stream.of("test1", "test2", "test3", "test4")
.filter(s -> s.contains("r"))
.map(s -> s + "map")
.map(String::toUpperCase)
.forEach(System.out::println);
当我查看下面示例
map(Function中使用的map操作符的定义时,它被称为方法引用,是lambda表达式的语法糖。换句话说:
String::toUpperCase
相当于:
s -> s.toUpperCase()
它是一种方法,它接受字符串
s
并返回一个字符串
,所有字母都来自s
大写,它是一个函数
它被称为方法引用,是lambda表达式的语法糖。换句话说:
String::toUpperCase
相当于:
s -> s.toUpperCase()
它是一种方法,它接受字符串
s
并返回一个字符串
,所有字母都来自s
大写,它是一个函数
根据函数
接口的应用
方法更容易理解的是方法r的匿名类表示参考String::toUpperCase
。它是这样的-
new Function<String, String>() {
@Override
public String apply(String str) { // read as given a String return a String (uppercased)
return str.toUpperCase();
}
}
新函数(){
@凌驾
公共字符串apply(String str){//read as给定字符串返回字符串(大写)
return str.toUpperCase();
}
}
字符串参数(str
)提供给上述apply
方法的是在上一次map
操作之后的流中的方法。根据函数
接口的apply
方法,更容易理解的是方法引用字符串::toUpperCase。事情是这样的-
new Function<String, String>() {
@Override
public String apply(String str) { // read as given a String return a String (uppercased)
return str.toUpperCase();
}
}
新函数(){
@凌驾
公共字符串apply(String str){//read as给定字符串返回字符串(大写)
return str.toUpperCase();
}
}
提供给上述apply
方法的字符串参数(str
)是上一次map
操作后流中的参数。该方法必须与lambdas s->s.toUpperCase()的函数接口R apply(T)
具有相同的签名这对我来说非常清楚,使用String::toUpperCase我看不到传递的参数,签名定义为空,它返回一个字符串!!!你能为我解释这一点吗?请为这个例子解释一下。forEach(System.out::println);.forEach(s->System.out.println(s));i undrestand它们是相同的,方法引用println,使用者查找void accept(T)方法;return void,println的核心定义是conforme public void println(String x),只有一个参数和returnvoid@Feres.o你完全误解了这一点。如果我有一个函数stringf(strings,inti,double d,char c),该怎么办
并像调用s->f(s,1,2.3,'a')
一样调用它。函数接受4个参数,但这并不重要,因为lambda只接受并返回一个参数。对我来说,它是(s,i,d,c)->{语句然后返回一个字符串}@参考o内部函数的其他参数是固定的。该方法必须具有与lambdas s->s.toUpperCase()的函数接口R apply(T)
相同的签名这对我来说非常清楚,使用String::toUpperCase我看不到传递的参数,签名定义为空,它返回一个字符串!!!你能为我解释这一点吗?请为这个例子解释一下。forEach(System.out::println);.forEach(s->System.out.println(s));i undrestand它们是相同的,方法引用println,使用者查找void accept(T)方法;return void,println的核心定义是conforme public void println(String x),只有一个参数和returnvoid@Feres.o你完全误解了这一点。如果我有一个函数stringf(strings,inti,double d,char c),该怎么办
并像调用s->f(s,1,2.3,'a')
一样调用它。函数接受4个参数,但这并不重要,因为lambda只接受并返回一个参数。对我来说,它是(s,i,d,c)->{语句然后返回字符串}@Feres。o内部函数的其他参数是固定的