【问题标题】:How to do lambda operations with stream?如何使用流进行 lambda 操作?
【发布时间】:2017-04-26 09:25:11
【问题描述】:

至于现在我在做什么:

Map<Integer, Item> itemList = getItems(input);

Iterator<Item> ItemIterator = input.getItems().iterator();

List<Item> updatedItems = Lists.newLinkedList();

for (int i = MIN; i <= input.getInputReq().getList().size(); i++) {
    Item item = itemList.get(i);
    if (item != null) {
        item.setFlag(false);
        item.setId(getId());
        updatedItems.add(item);
        itemList.remove(i);
    } else {
        if (ItemIterator.hasNext()) {
            updatedItems.add(ItemIterator.next());
        }
    }
}

有没有什么有效的方法可以用 java8 中的 Streams 和 lambda 做到这一点?

【问题讨论】:

  • 使用 lambda 和流?确定
  • @RobinTopper 抱歉让我的问题不清楚。输入是一个带有标志(布尔)和 Id(字符串)的对象

标签: java java-8 java-stream


【解决方案1】:

这是一个答案(不确定是否正确),但几乎和您的问题一样晦涩:

int size = input.getInputReq().getList();
List<Item> updatedItems = IntStream.range(0, size)
           .mapToObj(i -> itemList.get(i) )
           .map(e -> 
           {
             return Optional.of(e).map(i -> {
                i.setFlag(false);
                i.setId(getId());
                return i;
             }).orElse(ItemIterator.next());
           }).collect(Collectors.toList()); 

【讨论】:

  • 问题是我需要跟踪 2 个数字。我的列表从 0 开始,但我的地图从 1 开始。
  • @user3407267 已修复?
【解决方案2】:

在您的情况下,我会编写一个单独的方法来进行更新并将项目放入 updatedItems-collection:

private void updateItemsAndPutThemInList(Item item){
    item.setFlag(false);
    setId(getId());
    updatedItems.add(item);
}

然后用下面的代码处理它们:

input.getItems().stream().filter(i -> i != null).forEach(i -> updateItemsAndPutThemInList(i));

根据您的代码的目的,您可以指定必须将更新项目放入的列表作为私有方法的参数,其签名将是:

private void updateItemsAndPutThemInList(Item item, List<Item> updatedItems)

这需要 forEach 方法来获得这个列表的引用(它必须是有效的最终!)。

【讨论】:

  • 但问题是我需要跟踪 2 个整数。 1 - 列表索引和 2 - min 1 to size
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 2022-11-26
  • 2023-02-08
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
相关资源
最近更新 更多