标签: java-8

如何从 Optional 的 ifPresent 中选择值

如何从方法中选择值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)

java optional java-8

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

列表&lt;Map&lt;String, Object&gt;&gt;的Java 8过滤器和收集

好的,所以我有一个要过滤的地图列表,然后收集到另一个地图列表。每次我在整个过程中放入该列表时,我都会得到一个对象列表...帮助?!

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)

java filtering java-8 java-stream

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

将处理程序添加到每个记录器

我想为我的项目的每个类的每个记录器添加一个自定义处理程序。我有一个 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 logging java.util.logging java-8

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

Stream 中的 Bigdecimals 求和

我正在使用 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 lambda java-8 java-stream

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

返回 Java 8 流中的第一个匹配项(类似于 _.find)

我有一个静态方法,它使用 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)

java functional-programming java-8 lodash java-stream

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

如何从 Java 8 中的字符串数组创建 BigDecimal 流?

我的任务是订购作为字符串数组给出的 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)

我期待收到来自流专家的消息。
谢谢!

foreach bigdecimal java-8 java-stream

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

java 8流:复杂的流处理

我想创建一个对流执行一些复杂操作的方法(例如替换第 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中进行一些复杂的流处理?

java java-8 java-stream

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

无论日期如何,查找小时范围是否重叠

我有一组两个小时的范围

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)

java jodatime java-8

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

Java 8 - 尝试将字符串转换为 LocalDateTime

我正在尝试将下面的转换StringLocalDateTime,但不知何故它不起作用。

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)

模式中似乎有问题。

date java-8

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

Java 8 - 方法映射不适用于参数 (&lt;noType&gt;)

我想重构我的方法,它过滤 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 的方法中使用它的方法。你能告诉我我在哪里做错了吗?

java eclipse java-8 java-stream

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