是否有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 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) 我正在尝试使用`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 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) MyObj出于我们的目的,该对象包含String message在其他字段中。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)
问题是它不会提前终止,break也return不能在此 lambda 中使用来提前终止循环。
我看到流 anyMatch() 函数:
map.entrySet().stream().anymatch(....
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚正确的语法 - 如果这在这种情况下完全有效(如果我不比较地图的元素,而是比较每个元素的字段,它仍然可以使用)。
如果我有一个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操作。
我有一个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()?
基本上我有一个列表,它的元素将逐个处理,直到满足某些条件.如果任何元素满足该条件,则应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 8 Stream api.目前我想翻译像流一样的东西,但似乎我仍然不够舒服,因为我不知道如何做到这一点.
boolean isTrue = false;
for (Integer integer : intList) {
if (integer > 10) {
isTrue = true;
break;
}
}
Run Code Online (Sandbox Code Playgroud) 说我有这门课
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?但是,如果我正在检查的项目没有,它只是继续前进?
谢谢!
在下面的示例中,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) - > {})
如何将下面带有 return 语句的 for 循环转换为 lambda 表达式或带有过滤器的流。
for(PhysicianData d : physicianDataList)
{
if(d.getPhysicianName().equals(physicianName))
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)