lambda - 是否可以用 java 8 流替换简单的 java for 循环(带索引)

标签 lambda java-8 java-stream

我想对任何不成功的响应进行快速失败行为,如果一切都成功,那么我将返回最后一个成功的响应,如下面的代码所示。

for(int i=0;i<input.size(); i++){
   Data data = service.getData(input.get(i));
   if(data.isSuccessful() && i==input.size()-1){
      return data;
   }else if(!data.isSuccessful()){
    return data;
    }else{
    return null;
  }
 }

我试图用流替换上面提到的代码,但到目前为止还无法做到。主要问题是
我无法在 java8 流代码中模仿 i(index) 变量行为。
resp = input.stream().map((input)->{service.getData()}).filter(
(resp)->{
     if(!resp.isSuccessful())
        return true; 
     else if(resp.isSuccessful() && last resp)//if somehow I figure out last element
        return true;
     else 
        return false;}).findFirst();

最佳答案

不需要外部库。

return IntStream.range(0, input.size())
.mapToObj(i -> {
    Data data = service.getData(input.get(i));
    if (!data.isSuccessful() || i == input.size() - 1) {
        return Optional.of(data);
    }
    return Optional.<Data>empty();
})
.filter(Optional::isPresent)
.findFirst()
.orElse(null);
  • 有关使用索引循环的更多信息:Is there a concise way to iterate over a stream with indices in Java 8?
  • 考虑收回 Optional , 而不是结果或 null

  • 完整示例(可编译):
    import java.util.Optional;
    import java.util.stream.IntStream;
    
    class Data {
        public boolean isSuccessful() {return false;}
    }
    class Input {
        public Object get(int i) {return null;}
        public int size() {return 0;}
    }
    class Service {
        public Data getData(Object object) {return null;}
    }
    public class T {
        public static void main(String[] args) {method();}
    
        protected static Optional<Data> method() {
            Input input = new Input();
            Service service = new Service();
    
            return IntStream.range(0, input.size())
                    .mapToObj(i -> {
                        Data data = service.getData(input.get(i));
                        if (!data.isSuccessful() || i == input.size() - 1) {
                            return Optional.of(data);
                        }
                        return Optional.<Data>empty();
                    })
                    .filter(Optional::isPresent)
                    .findFirst()
                    .orElse(null);
        }
    }
    

    关于lambda - 是否可以用 java 8 流替换简单的 java for 循环(带索引),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34762710/

    相关文章:

    java - 添加使用 java 8 的 .jar 文件后的 Android 编译循环

    java - 合并包含集合的映射会抛出 UnsupportedOperationException

    c# - Lambda 表达式 : == vs. .Equals()

    java - 如何使用 Streams API 取消扁平化的层次结构

    asp.net-mvc - 是否可以将 Lambda 与 List<ViewModel> 的模型一起使用?

    java - 将包含数据的文件解析为 Map<String, Date>

    java - 如何使用流重用具有几乎相同实现的 Java 方法

    java - 什么时候应该在 Java 中使用 IntStream.range?

    java - 使用函数进行bean比较的库函数?

    node.js - AWS lambda 发送 SNS "succeeds"但消息并未实际发送