我不太清楚我是否理解Oracle Java教程中的Lambda表达式教程.令我困惑的主要事情是lambda.ds.print的索引参数(索引 – > {…}编译器如何知道甚至是什么值索引?索引未在程序中的任何其他地方声明,那么什么究竟是Index参数甚至引用,编译器如何知道?
有问题:
public class DataStructure {
private final static int SIZE = 15;
private int[] arrayOfInts = new int[SIZE];
public DataStructure() {
for (int i = 0; i < SIZE; i++) {
arrayOfInts[i] = i;
}
}
public int size() {
return SIZE;
}
public int get(int index) {
return arrayOfInts[index];
}
interface DataStructureIterator extends java.util.Iterator<Integer> { }
private class EvenIterator implements DataStructureIterator {
private int nextIndex = 0;
public boolean hasNext() {
return (nextIndex <= SIZE - 1);
}
public Integer next() {
Integer retValue = Integer.valueOf(arrayOfInts[nextIndex]);
nextIndex += 2;
return retValue;
}
}
public DataStructureIterator getEvenIterator() {
return new EvenIterator();
}
public void printEven() {
DataStructureIterator iterator = getEvenIterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
}
public void print(DataStructureIterator iterator) {
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
}
public void print(java.util.function.Function<Integer, Boolean> function) {
for (int i = 0; i < SIZE; i++) {
if (function.apply(i)) {
System.out.print(arrayOfInts[i] + " ");
}
}
System.out.println();
}
public static Boolean isEvenIndex(Integer index) {
if (index % 2 == 0) return Boolean.TRUE;
return Boolean.FALSE;
}
public static Boolean isOddIndex(Integer index) {
if (index % 2 == 0) return Boolean.FALSE;
return Boolean.TRUE;
}
public static void main(String s[]) {
DataStructure ds = new DataStructure();
System.out.println("printEven()");
ds.printEven();
System.out.println("print(DataStructureIterator) with "
+ "getEvenIterator");
ds.print(ds.getEvenIterator());
System.out.println("print(DataStructureIterator) with "
+ "anonymous class, odd indicies");
ds.print(
new DataStructure.DataStructureIterator() {
private int nextIndex = 1;
public boolean hasNext() {
return (nextIndex <= ds.size() - 1);
}
public Integer next() {
int retValue = ds.get(nextIndex);
nextIndex += 2;
return retValue;
}
}
);
System.out.println("print(Function) with lambda expressions");
ds.print(index -> {
if (index % 2 == 0) return Boolean.TRUE;
return Boolean.FALSE;
});
ds.print(index -> {
if (index % 2 == 0) return Boolean.FALSE;
return Boolean.TRUE;
});
System.out.println("print(Function) with method references");
ds.print(DataStructure::isEvenIndex);
ds.print(DataStructure::isOddIndex);
}
}
解决方法:
ds.print方法采用Function< Integer,Boolean>类型的参数.所以这:
ds.print(index -> {
if (index % 2 == 0) return Boolean.TRUE;
return Boolean.FALSE;
});
使用匿名类而不是lambda来表示与此语法等效:
ds.print(new Function<Integer,Boolean>() {
@Override
public Boolean apply(Integer index) {
if (index % 2 == 0) return Boolean.TRUE;
return Boolean.FALSE;
}
});
(Function类的功能方法是apply
.)
所以参数名称索引是任意的.你可以随意调用它.它只是lambda方法的本地名称.其值由打印中的此调用提供:
if (function.apply(i)) ...
标签:java,java-8,lambda 来源: https://codeday.me/bug/20190824/1712276.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。