如何从方法中选择值ifPresent,因为此方法返回 void?
我要应用的逻辑是:如果对象deliveryInfo不是null,则取交货数量并将其设置到对象中dto,但使用Optional,不进行任何空检查。
Optional<TT021DeliveryCodingContainerDto> deliveryInfo =
tt021OrderingBusinessHandler
.getDeliveryCodingContainersByDeliveryAndOrderDetail(
delivery.getId(), position.getOrderDetails().getId());
deliveryInfo.ifPresent(TT021DeliveryCodingContainerDto::getDeliveredQuantity);
dto.setQuantityDelivered(deliveredQuantity);
Run Code Online (Sandbox Code Playgroud) 好的,所以我有一个要过滤的地图列表,然后收集到另一个地图列表。每次我在整个过程中放入该列表时,我都会得到一个对象列表...帮助?!
List<Map<String, Object>> segments = (List<Map<String, Object>>) (List<?>) query.getResultList();
List<Map<String, Object>> segmentsWithMoreVersions = segments.stream()
.filter((Object s) -> {
Object[] ss = (Object[]) s;
if(((Long) ss[2]) == 1)
{
return false;
}
return true;
})
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如您所见...在过滤器方法中,我使用了一个对象,因为我无法将 s 变量设为 Map。当我尝试时,我得到一个 ClassCastException。
编辑:好的,也许需要更多信息......所以我的segments变量是这样的:
[
{'name': 'ABC', 'version': 1, 'ct': 1},
{'name': 'AAA', 'version': 1, 'ct': 1},
{'name': 'BFD', 'version': 1, 'ct': 4},
{'name': 'SDE', 'version': 1, 'ct': 1}
]
Run Code Online (Sandbox Code Playgroud)
我想要做的是过滤掉所有 ct 为 1 的地图。过滤器方法正在查看该对象(因为我无法将其转换为地图)并检查它是否 == 为 1 ,如果是这样,它不会将其返回到流中。
Edit2:评论后,我编辑为以下内容:
List<Map<String, …Run Code Online (Sandbox Code Playgroud) 我想为我的项目的每个类的每个记录器添加一个自定义处理程序。我有一个 logging.properties 文件,它在最开始时使用:
try (InputStream in = ReportingService.class.getResourceAsStream("logging.properties")) {
LogManager.getLogManager().readConfiguration(in);
} catch (IOException ex) {
Logger.getLogger(myClass.class.getName()).log(Level.SEVERE, null, ex);
}
Run Code Online (Sandbox Code Playgroud)
logging.properties 文件如下所示:
handlers=java.util.logging.ConsoleHandler,myPackage.AlertHandler
.level=SEVERE
java.util.logging.ConsoleHandler.level=SEVERE
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
myPackage.AlertHandler.level=SEVERE
myPackage.AlertHandler.formatter=java.util.logging.SimpleFormatter
Run Code Online (Sandbox Code Playgroud)
而 myPackage.AlertHandler.java 看起来像这样:
package myPackage;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import javafx.scene.control.Alert;
public class AlertHandler extends Handler {
@Override
public void publish(LogRecord lr) {
Alert a = new Alert(Alert.AlertType.ERROR);
a.setTitle("Exception!");
a.setHeaderText("Exception was thrown, here is the StackTrace:");
a.setContentText(getFormatter().formatMessage(lr));
Platform.runLater(()->{a.showAndWait();});
}
@Override
public void flush() {
//no real handler is open, nothing to flush
} …Run Code Online (Sandbox Code Playgroud) 我正在使用 Java 8 Stream,在其中迭代两个集合,在通过过滤器后,我想将流中的 bigdecimal 变量之一与外部 bigDecimal 变量“restrictionsNumber”相加
这是我的代码:
final BigDecimal restrictionsNumber = cmd.amount.getNumberOfUnits();
order.products()
.stream()
.flatMap(product -> product.getRestrictions()
.stream()
.filter(restriction -> restriction.equals(newProductRestriction))
.map(restriction -> restrictionsNumber.add(product.getAmount()
.getNumberOfUnits())));
Run Code Online (Sandbox Code Playgroud)
最后一张地图是我试图将两个 bigdecimals 相加的地图。我知道我做错了什么。谁能给我一个关于如何使用 Stream.js 做这件事的建议。
我正在尝试重构这个旧的时尚代码
final BigDecimal restrictionsNumber = cmd.amount.getNumberOfUnits();
for (Product product : order.products()) {
for (String oldProductRestriction : product.getRestrictions()) {
if (oldProductRestriction.equals(newProductRestriction)) {
restrictionsNumber = restrictionsNumber.add(product.getAmount()
.getNumberOfUnits());
}
}
}
Run Code Online (Sandbox Code Playgroud)
问候。
我有一个静态方法,它使用 java 8 流从集合中识别匹配类型。
而不是使用.filterand .findAny,我想使用类似于 lodash 的_.find的方法,即“迭代集合的元素并返回第一个元素谓词返回真值。”
“查找”类型的方法大概会使代码更加高效和简洁
public static List<Class> types = Arrays.asList(
Contact.class,
Response.class,
Request.class
);
public static Optional<Class> resolveTypeFromFieldNames(Set<String> itemFields) {
return types
.stream()
.filter(itemType -> {
Set<String> fields = Arrays.stream(itemType.getDeclaredFields())
.filter(f -> !f.isSynthetic())
.map(Field::getName)
.collect(Collectors.toSet());
return itemFields.equals(fields);
})
.findAny();
}
Run Code Online (Sandbox Code Playgroud) 我的任务是订购作为字符串数组给出的 BigDecimals。我的想法是使用BigDecimal的String参数构造函数,然后排序,然后用forEach打印出来。这是代码部分:
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n + 2];
for (int i = 0; i < n; i++) {
s[i] = sc.next();
}
Stream.of(s)
.map(i -> new BigDecimal(i))
.sorted((bg1, bg2) -> bg1.compareTo(bg2))
.forEach(System.out::println); //line 22
Run Code Online (Sandbox Code Playgroud)
但是我为 forEach 行得到了这个 NullPointerException:
Exception in thread "main" java.lang.NullPointerException
at java.math.BigDecimal.<init>(BigDecimal.java:806)
at Solution.lambda$main$1(Solution.java:20)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at Solution.main(Solution.java:22)
Run Code Online (Sandbox Code Playgroud)
我期待收到来自流专家的消息。
谢谢!
我想创建一个对流执行一些复杂操作的方法(例如替换第 7 个元素, 删除最后一个元素, 删除相邻的重复项等)而不缓存整个流。
但是什么流 api 让我插入这个方法?我是否必须创建自己的收集器,以便在收集时将项目发送到其他流?但这会改变数据流的方向,从拉到推,对吧?
这种方法的可能签名是什么?
Stream<T> process(Stream<T> in)
Run Code Online (Sandbox Code Playgroud)
可能是不可能的(在单线程代码中),因为只有在收集整个输入流后才能返回结果
另一个想法:
void process(Stream<T> in, Stream<T> out)
Run Code Online (Sandbox Code Playgroud)
似乎也有点缺陷,因为 java 不允许发出将项目插入现有流(作为out参数提供)。
那么我如何在java中进行一些复杂的流处理?
我有一组两个小时的范围
10 PM - 02 AM
01 AM - 08 AM
Run Code Online (Sandbox Code Playgroud)
无论日期如何,我都想检查它们中的任何一个是否重叠。
例如:第一个范围可能是 8 月 1 日和 2 日,而第二个范围可能是 8 月 10 日。
这是我到目前为止
private Interval createInterval(final OpeningClosingTimesEntry entry) {
LocalDateTime openingHour = LocalDateTime.fromDateFields(entry.getOpenTime());
LocalDateTime closingHour = LocalDateTime.fromDateFields(entry.getCloseTime());
if(closingHour.isBefore(openingHour)){
closingHour = closingHour.plusDays(1);
}
return new Interval(openingHour.toDate().getTime(), closingHour.toDate().getTime());
}
private Interval adjustSecondIntervalDay(final Interval interval1, final Interval interval2){
if(interval1.getEnd().getDayOfYear() > interval2.getStart().getDayOfYear()){
DateTime start = interval2.getStart().plusDays(1);
DateTime end = interval2.getEnd().plusDays(1);
return new Interval(start, end);
}
return interval2;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将下面的转换String为LocalDateTime,但不知何故它不起作用。
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss.SSS");
val dateTime = LocalDateTime.parse("2016-09-21 13:43:27.000", formatter);
Run Code Online (Sandbox Code Playgroud)
模式中似乎有问题。
我想重构我的方法,它过滤 AssetLink 对象,获取作为 AssetLink 目标的 Content 对象,然后根据 Content 对象设置 ContentLinkMetadata 对象的字段。我的新方法是这样的:
private List<ContentLinkMetadata> getAndFillInternalLinks(final Lesson lesson) {
List<ContentLinkMetadata> internalLinks = new ArrayList<>();
lesson.getAssetLinks().stream()
.filter(linkAsAssetLink -> ALLOWED_INTERNAL_LINK_TYPES.contains(linkAsAssetLink.getTargetType()))
.map(linkAsAssetLink -> {
Content link = contentProvider.getLazyById(linkAsAssetLink.getTargetId());
ContentLinkMetadata internalLink = new ContentLinkMetadata();
internalLink.setDescription(link.getDescription());
internalLink.setId(link.getId());
internalLink.setTitle(link.getTitle());
internalLink.setFriendlyUrl(friendlyUrlResolver.makeUrl(link));
internalLink.setTypeId(link.getTypeId());
internalLinks.add(internalLink);
});
return internalLinks;
}
Run Code Online (Sandbox Code Playgroud)
但是我在 .map 上遇到错误,它说“Stream 类型中的方法映射不适用于参数(noType linkAsAssetLink),我不明白这一点。为什么它说 linkAsAssetLink 是“noType”它实际上是 AssetLink我可以在 contentProvider 的方法中使用它的方法。你能告诉我我在哪里做错了吗?