【问题标题】:Change For expression to lambda Java 8 [closed]将 For 表达式更改为 lambda Java 8 [关闭]
【发布时间】:2021-02-09 01:19:51
【问题描述】:

我想将此表达式从这个 for 循环更改为使用 java 8 的 lambda 表达式,并且我想返回数组中与该值匹配的数字位置。

String[] values= {"VALUE1", "VALUE2", "VALUE3"};

int stringIndex;
for(stringIndex = 0; stringIndex < values.length; stringIndex++)
    if(stringWithValue.contains(values[stringIndex])) break;

例如,

stringWithValue = "SomeOtherThingVALUE1" 应该返回 0 等其他值。

【问题讨论】:

  • 那么,你有什么尝试?
  • 你的循环实际上并没有做任何事情。循环的目标是什么?
  • @TimBiegeleisen,循环实际上检查匹配和break 如果找到。 stringIndex的值可以在循环外使用来检查索引

标签: java arrays lambda java-8


【解决方案1】:

可能是这样的吗?

说实话,我不确定它是否比你的循环更好。

import java.util.stream.*;

public class LambdaDemo {
    public static void main(String[] args) {
        String stringWithValue = "xxxxxxxVALUE2xxxxxxx";
        String[] values= {"VALUE1", "VALUE2", "VALUE3"};

        int stringIndex = IntStream
                .range(0, values.length)
                .filter(i -> stringWithValue.contains(values[i]))
                .findFirst()
                .orElseGet(() -> -1);
        
        System.out.println(stringIndex);
    }
}

【讨论】:

  • 为什么不.orElse(-1)(或.orElse(values.length) 以匹配循环的行为)?在这里使用orElseGet 没有任何优势。
  • 谢谢你 Chris Foley,我真的很感激。最好的问候
  • @EdgarTorres 如果这确实是您正在寻找的答案,那么您应该接受它。
  • 是的,效果很好!这就是我没有成功的尝试。谢谢你:)
【解决方案2】:

将 For 表达式更改为 Lambda。

Lambda 由各种函数式接口构成。在您的情况下,您需要一个BiFunction,它将一个字符串数组和一个字符串作为参数并返回一个整数。

String[] values = { "VALUE1", "VALUE2", "VALUE3" };
 
BiFunction<String[], String, Integer> getIndex =
        (arr, val) -> IntStream.range(0, arr.length)
                .filter(i -> val.contains(arr[i])).findFirst()
                .orElse(-1);

int i = getIndex.apply(values,"SomeOtherThingVALUE3");
System.out.println(i);      
i = getIndex.apply(values,"Hello");
System.out.println(i);

打印

2
-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 2022-11-14
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多