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块内部?
实际上消息已经说明了.请注意,在使用流时,您通常会尽量避免.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)