相关疑难解决方法(0)

通过谓词限制流

是否有Java 8流操作限制(可能是无限的)Stream直到第一个元素无法匹配谓词?

在Java 9中,我们可以使用takeWhile下面的示例来打印小于10的所有数字.

IntStream
    .iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

由于Java 8中没有这样的操作,以一般方式实现它的最佳方法是什么?

java java-8 java-stream

179
推荐指数
9
解决办法
6万
查看次数

终止或破坏java 8流循环

我有一个java 8流循环,其中包含以下内容:

    void matchSellOrder(Market market, Order sellOrder) {
        System.out.println("selling " + market.pair() + " : " + sellOrder);

        market.buyOrders()
                .stream()
                .filter(buyOrder -> buyOrder.price >= sellOrder.price)
                .sorted(BY_ASCENDING_PRICE)
                .forEach((buyOrder) -> {
                    double tradeVolume = Math.min(buyOrder.quantity, sellOrder.quantity);
                    double price = buyOrder.price;

                    buyOrder.quantity -= tradeVolume;
                    sellOrder.quantity -= tradeVolume;

                    Trade trade = new Trade.Builder(market, price, tradeVolume, Trade.Type.SELL).build();
                    CommonUtil.convertToJSON(trade);

                    if (sellOrder.quantity == 0) {
                        System.out.println("order fulfilled");
                        // break loop there
                    }
                });
    }
Run Code Online (Sandbox Code Playgroud)

当满足某些条件时,如何摆脱循环?什么是正确的关闭流的方式?

UPDATE

我误用了流tecnique,假设它是一个循环,它不是为此而设计的.这是我最终使用以下答案提供的代码:

        List<Order> applicableSortedBuyOrders = market.buyOrders()
                .stream()
                .filter(buyOrder -> buyOrder.price >= sellOrder.price) …
Run Code Online (Sandbox Code Playgroud)

java loops java-8 java-stream

28
推荐指数
2
解决办法
7万
查看次数

如何使用lambda流迭代嵌套列表?

我正在尝试使用`stream将以下代码重构为lambda表达式,尤其是嵌套的foreach循环:

public static Result match (Response rsp) {
    Exception lastex = null;

    for (FirstNode firstNode : rsp.getFirstNodes()) {
        for (SndNode sndNode : firstNode.getSndNodes()) {
            try {
                if (sndNode.isValid())
                return parse(sndNode); //return the first match, retry if fails with ParseException
            } catch (ParseException e) {
                lastex = e;
            }
        }
    }

    //throw the exception if all elements failed
    if (lastex != null) {
        throw lastex;
    }

    return null;
}
Run Code Online (Sandbox Code Playgroud)

我开始时:

rsp.getFirstNodes().forEach().?? // how to iterate the nested 2ndNodes?
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

17
推荐指数
2
解决办法
4万
查看次数

Java 8,比较两个映射并返回结果

我正在使用Java 8功能比较2个地图,并根据条件想要返回结果.使用.forEach显示编译时错误,基本上,返回是从Lambda表达式返回而不是从循环返回.如何从包围lambda的循环返回?
请注意,我没有比较两个地图对象的相等性

nMap.forEach((k,v) -> {
    if (!mMap.containsKey(k) || mMap.get(k) < v) {
        return -1;
    }
});
Run Code Online (Sandbox Code Playgroud)

java foreach lambda java-8 java-stream

8
推荐指数
1
解决办法
2134
查看次数

如何在 HashMap 中查找给定条件为 true 的任何元素

  • 给定一个对象,MyObj出于我们的目的,该对象包含String message在其他字段中。
  • 给定一个 HashMap Map <MultiKey<String>,MyObj> map,.

我想循环遍历 HashMap 查找 MyObj 消息所在的任何元素searchValue。我本质上是想在地图上使用stream().anyMatch(),我只是想知道是否searchValue存在,即使在任何地方一次 - 即短路是更好的选择。

Foreach 循环:

map.forEach((k,v) -> {
    if (v.message.equalsIgnoreCase(searchValue)) {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是它不会提前终止,breakreturn不能在此 lambda 中使用来提前终止循环。

我看到流 anyMatch() 函数:

 map.entrySet().stream().anymatch(....
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚正确的语法 - 如果这在这种情况下完全有效(如果我不比较地图的元素,而是比较每个元素的字段,它仍然可以使用)。

java loops hashmap

5
推荐指数
1
解决办法
1万
查看次数

使用Java流,如何过滤集合,使结果包含所有元素,直到找到匹配项?

如果我有一个List包含对象

new MyObj("some"),
new MyObj("foo"),
new MyObj("bar"),
new MyObj("xyz");
Run Code Online (Sandbox Code Playgroud)

并希望在匹配某些条件使用Java 8流对其进行过滤,例如

myObj.prop = "foo";
Run Code Online (Sandbox Code Playgroud)

如何实现?

以上示例的结果应为

new MyObj("some"),
new MyObj("foo")
Run Code Online (Sandbox Code Playgroud)

那将是“传统”的方式:

List<MyObj> results = new ArrayList<>();
for (MyObj myObj : myObjList) {
  if (!myObj.prop.equals("foo")) {
    results.add(myObj);
  } else {
    results.add(myObj);
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

它不是谓词限制流的重复,因为它不包含匹配的元素。但是,我应该能够适应takeWhile操作。

java java-8 java-stream

4
推荐指数
1
解决办法
1046
查看次数

For循环到Java 8 Stream forEach()

我有一个for循环的列表,用于检查db中是否存在索引值.

如果任何值不存在,它会立即返回false.

public boolean exists(List<String> keys) {
     for(String key: keys) {
         boolean exists = service.existsByKey(key);
         if(!exists) return false;
      }
        return true;
}
Run Code Online (Sandbox Code Playgroud)

我试图将它改为java 8 foreach,但它没有按预期工作.

keys.stream().forEach(k -> {
    boolean exists = service.existsByKey(k);
    if(!exists) return false;
});
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?为什么不进入if(!exists)staetment forEach()

java java-8

3
推荐指数
1
解决办法
469
查看次数

java - 如何使用lambda表达式从forEach方法中断

基本上我有一个列表,它的元素将逐个处理,直到满足某些条件.如果任何元素满足该条件,则应true以其他方式返回false.该方法如下:

public boolean method(List<Integer> data) {
    data.forEach(item -> {
        if (some condition is met) {
            return true; //  Getting Unexpected return value here
        }
    });
    return false;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在条件满足后立即打破这个forEach循环而不是循环遍历所有元素?

java foreach lambda java-8

2
推荐指数
1
解决办法
2933
查看次数

使用If条件迭代ArrayList并使用流api返回boolean标志

我试图让自己更熟悉Java 8 Stream api.目前我想翻译像流一样的东西,但似乎我仍然不够舒服,因为我不知道如何做到这一点.

boolean isTrue = false;

for (Integer integer : intList) {
    if (integer > 10) {
        isTrue = true;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

java java-8

2
推荐指数
1
解决办法
491
查看次数

使用Lambda和forEach在Set中查找Object并触发布尔值

说我有这门课

    public class MovieCharacter {

    private String name;

    public String getName() { return name ; }
    public String setName(String name) { this.name = name; }
    }
Run Code Online (Sandbox Code Playgroud)

我正在运行测试并有一个Set,我想使用Lambda来梳理每个对象,看它是否包含Name所需的字符串.如果找到名称,则布尔值跳转到"true".找到它之后,我不希望布尔值再次改变.

Set<MovieCharacter> mySet // assume this Set has previously been created and 
                     // contains 1,000's of MovieCharacter

boolean hasName = false;
mySet.forEach( i -> i.getName().equals("Darth Vader")) // add here?
assertTrue(hasName);
Run Code Online (Sandbox Code Playgroud)

我知道我很接近,但是如何完成lambda线的关闭,以便如果该组包含一个MovieCharacter,其中.getName()返回"Darth Vader",则布尔值将被设置为true?但是,如果我正在检查的项目没有,它只是继续前进?

谢谢!

java foreach lambda java-8

1
推荐指数
1
解决办法
485
查看次数

从Java 8 forEach循环返回一个值

在下面的示例中,someObjects是一个集合.如果条件在循环内匹配,我试图返回true,但是这似乎没有编译.但是,当我只是添加"返回"它工作正常.我需要解决的问题是什么?

public boolean find(){

    someObjects.forEach(obj -> {
       if (some_condition_met) {
          return true;
       }
    });

    return false;
}
Run Code Online (Sandbox Code Playgroud)

编译错误

Iterable类型中的forEach(Consumer)方法不适用于参数((obj) - > {})

java java-8

0
推荐指数
2
解决办法
2万
查看次数

将带有 return 语句的 for 循环转换为流并过滤 lambda 语句

如何将下面带有 return 语句的 for 循环转换为 lambda 表达式或带有过滤器的流。

for(PhysicianData d : physicianDataList)
    {
        if(d.getPhysicianName().equals(physicianName))
        {
            return true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

0
推荐指数
1
解决办法
303
查看次数

标签 统计

java ×12

java-8 ×11

java-stream ×6

lambda ×4

foreach ×3

loops ×2

hashmap ×1