gpt4 book ai didi

java - 了解 Lambda 表达式

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:44:43 25 4
gpt4 key购买 nike

我不太确定我是否理解 Oracle Java 教程中的 Lambda 表达式教程。让我感到困惑的主要是 lambda 的 Index 参数。ds.print(index ->{...} 编译器如何知道 index 甚至是什么值?Index 没有在任何地方声明程序中的其他内容那么 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 。)

所以参数名index是任意的。你可以随心所欲地调用它。它只是您的 lambda 方法的本地名称。它的值由 print 中的此调用提供:

if (function.apply(i)) ...

关于java - 了解 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com