访问Java 8 Lambda表达式中的字段

Kar*_*yan 1 java java-8 java-stream

我写了一个线性搜索实现.我也使用Java 7和8编写了代码.

以下是我的代码:

int[] arr = new int[] { 12, 34, 94, 8, 37, 10 };
System.out.println("Enter the element to search: ");
Scanner scan = new Scanner(System.in);
int element = scan.nextInt();
boolean found = false;

// Linear search implementation using Java 7 features
for (int i = 0; i < arr.length; i++) {
    if (element == arr[i]) {
        int n = element;
        System.out.println("Element : "+n+" has been found at the index : "+i);
        found = true;
        break;
    }
}

// Linear search implementation using Java 8 features
IntStream.range(0, arr.length)
    .forEach(i -> {
        if (element == arr[i]) {
            int n = element;
            System.out.println("Element : " + n + " has been found at the index : " + i);
            found = true;
            break;
        }
    });

if (!found) {
    System.out.println("Element : "+ element + " not found.");
}
Run Code Online (Sandbox Code Playgroud)

以下代码正常工作:

for (int i = 0; i < arr.length; i++) {
    if (element == arr[i]) {
        int n = element;
        System.out.println("Element : " + n + " has been found at the index : " + i);
        found = true;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在具有Java 8功能的代码下面,为forEach循环内的字段抛出了错误

IntStream.range(0, arr.length)
    .forEach(i -> {
        if (element == arr[i]) {
            int n = element;
            System.out.println("Element : " + n + " has been found at the index : " + i);
            found = true;
            break;
        }
    });
Run Code Online (Sandbox Code Playgroud)

发生错误:

在封闭范围内定义的局部变量必须是最终的或有效的最终变量

break不能在循环或开关之外使用

如何boolean found在Java 8功能中访问forEach块内部?

Rol*_*and 5

实际上消息已经说明了.请注意,在使用流时,您通常会尽量避免.forEach(或者至少不要将for-loops转换为.forEach).

您可能更想要的是以下内容:

IntStream.range(0, arr.length)
        .filter(i -> element == arr[i]) // .equals( ??
        .findFirst()
        .ifPresent(i -> System.out.println("Element : "+element+" has been found at the index : "+i));
Run Code Online (Sandbox Code Playgroud)

如果您还要处理案件,则无法找到,请使用以下内容:

OptionalInt result = IntStream.range(0, arr.length)
        .filter(i -> element == arr[i]) // .equals( ??
        .findFirst();
if (result.isPresent()) {
  System.out.printf("Element : %s has been found at the index : %d%n", element, result.getAsInt());
} else {
  // none found
  System.out.printf("Element %s not found%n", element);
}
Run Code Online (Sandbox Code Playgroud)

较新的Java版本支持ifPresentOrElse可能在这里有用,例如(由MC Emperor测试的代码,因为我这里没有Java> 8 ;-)):

...
.findFirst()
.ifPresentOrElse(i -> System.out.printf("Element : %s has been found at the index : %d%n", element, i),
                () -> System.out.printf("Element %s not found%n", element));
Run Code Online (Sandbox Code Playgroud)