标签: java-8

此表达式的目标类型必须是MethodReferences中的功能接口

为什么以下代码无法编译.

Consumer con = (s) -> System.out::println;

它说

此表达式的目标类型必须是功能接口

即使消费者是功能界面.以下工作正常.

Consumer con2 = (s) -> {System.out.println(s);};

java-8 method-reference

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

您是否有Java 8 Functional接口列表(不是java.util.function中列出的接口)?

我试图看看是否有任何方法可以获得Java 8中作为功能接口的所有接口的列表.我不是在谈论这个页面上的列表:

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html

相反,我在谈论像Comparator,FileFilter和Runnable这样的接口--API文档显示的接口是这样的功能:

@FunctionalInterface公共接口Runnable

这些地方有完整的清单吗?

谢谢!

java java-8 functional-interface

13
推荐指数
4
解决办法
4331
查看次数

无法推断JAVA 8的功能接口类型

我有一个工厂(注册表DP)初始化类:

public class GenericFactory extends AbstractFactory {

    public GenericPostProcessorFactory() {
        factory.put("Test",
                defaultSupplier(() -> new Test()));
        factory.put("TestWithArgs",
                defaultSupplier(() -> new TestWithArgs(2,4)));
    }

}

interface Validation

Test implements Validation
TestWithArgs implements Validation
Run Code Online (Sandbox Code Playgroud)

并在AbstractFactory中

 protected Supplier<Validation> defaultSupplier(Class<? extends Validation> validationClass) {
        return () -> {
            try {
                return validationClass.newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                throw new RuntimeException("Unable to create instance of " + validationClass, e);
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

但我不断得到无法推断功能接口类型错误.我在这做错了什么?

java registry lambda java-8

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

LocalDateTime,ZonedDateTime和Timestamp

我有一个SpringBoot应用程序.使用Spring Initializer,嵌入式Tomcat,Thymeleaf模板引擎和包作为可执行的JAR文件.

我有一个具有2个属性的域对象(initDate,endDate).我想创建2个转换器来处理mySQL DB

@Convert(converter = LocalDateTimeAttributeConverter.class) 
private LocalDateTime initDate;

@Convert(converter = ZonedDateTimeAttributeConverter.class) 
private ZonedDateTime endDate;
Run Code Online (Sandbox Code Playgroud)

转换器1(可以)

@Converter
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {

    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime localDateTime) {
        return (localDateTime == null ? null : Timestamp.valueOf(localDateTime));
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
        return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我想要创建的那个

@Converter
public class ZonedDateTimeAttributeConverter implements AttributeConverter<ZonedDateTime, Timestamp> {

    @Override
    public Timestamp convertToDatabaseColumn(ZonedDateTime zoneDateTime) {
        return (zoneDateTime == null ? null : Timestamp.valueOf(zoneDateTime));
    } …
Run Code Online (Sandbox Code Playgroud)

java mysql java-8 java-time java-date

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

如何在Stream上重用过滤器和地图的应用程序?

我有一组从共享类型(即继承域对象的GroupRecord extends Record,RequestRecord extends Record).亚型具有特定属性(即GroupRecord::getCumulativeTime,RequestRecord::getResponseTime).

此外,由于解析日志文件,我有一个混合子类型的记录列表.

List<Record> records = parseLog(...);
Run Code Online (Sandbox Code Playgroud)

为了计算日志记录的统计数据,我想仅在与特定子类型匹配的记录子集上应用数学函数,即仅在GroupRecords上.因此,我希望有一个特定子类型的过滤流.我知道我可以使用一个filtermap一个子类型

records.stream()
       .filter(GroupRecord.class::isInstance)
       .map(GroupRecord.class::cast)
       .collect(...
Run Code Online (Sandbox Code Playgroud)

在流上多次应用此过滤器和强制转换(特别是对于不同的计算多次执行相同的子类型时)不仅繁琐,而且会产生大量重复.

我目前的做法是使用a TypeFilter

class TypeFilter<T>{

    private final Class<T> type;

    public TypeFilter(final Class<T> type) {
        this.type = type;
    }

    public Stream<T> filter(Stream<?> inStream) {
        return inStream.filter(type::isInstance).map(type::cast);
    }
}
Run Code Online (Sandbox Code Playgroud)

要应用于流:

TypeFilter<GroupRecord> groupFilter = new TypeFilter(GroupRecord.class); 

SomeStatsResult stats1 = groupFilter.filter(records.stream())
                                      .collect(...)
SomeStatsResult stats2 = groupFilter.filter(records.stream())
                                      .collect(...)
Run Code Online (Sandbox Code Playgroud)

它有效,但我发现这种方法对于这么简单的任务来说有点多了.因此我想知道,使用流和函数以简洁和可读的方式使这种行为可重用是否有更好或更好的方法是什么?

java java-8 java-stream

13
推荐指数
2
解决办法
1696
查看次数

使用Collectors.summingInt时如何获取自定义类型而不是Integer?

我目前正在创建一个Map<String, Map<LocalDate, Integer>>这样的Integer代表秒:

Map<String, Map<LocalDate, Integer>> map = stream.collect(Collectors.groupingBy(
            x -> x.getProject(),
            Collectors.groupingBy(
                x -> x.getDate(),
                Collectors.summingInt(t -> t.getDuration().toSecondOfDay())
            )
        ));
Run Code Online (Sandbox Code Playgroud)

我怎么能创建一个Map<String, Map<LocalDate, Duration>>

java grouping java-8 java-stream collectors

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

然而,非捕获lambda似乎捕获了封闭的实例

我写了这段代码:

import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) throws Exception {
        new Main();
    }

    private Main() throws Exception {
        Supplier<Thread> supplier = (Supplier<Thread> & Serializable) () -> new Thread() {};
        new ObjectOutputStream(System.out).writeObject(supplier);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我会得到一个例外:

Exception in thread "main" java.io.NotSerializableException: Main
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at Main.<init>(Main.java:28)
Run Code Online (Sandbox Code Playgroud)

但是,我的理解是我正确地制作了lambda Serializable并且我声明它不会引用任何周围的上下文,因此它是一个非捕获的 lambda.然而,Main实例被捕获并且lambda表达式的结果无法序列​​化.我意识到我在lambda中声明了一个匿名类,但我希望lambda实例本身是它的封闭实例,而不是周围的Main类型.

这种行为是Java语言规范所期望的,如果是的话,为什么会这样?

java lambda language-lawyer java-8

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

java.time.format.DateTimeParseException:无法在索引3处解析文本

我使用Java 8来解析日期并找到两个日期之间的差异.

这是我的片段:

String date1 ="01-JAN-2017";
String date2 = "02-FEB-2017";

DateTimeFormatter df = DateTimeFormatter .ofPattern("DD-MMM-YYYY", en);
LocalDate  d1 = LocalDate.parse(date1, df);
LocalDate  d2 = LocalDate.parse(date2, df);

Long datediff = ChronoUnit.DAYS.between(d1,d2);
Run Code Online (Sandbox Code Playgroud)

当我运行时,我收到错误:

java.time.format.DateTimeParseException:无法在索引3处解析文本

date-parsing java-8 java-time

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

什么MIN/MAX值适用于ZonedDateTime和Instant.toEpochMilli?

我想使用可以在ZonedDateTime和之间进行转换的MIN/MAX时间值Instant.toEpochMilli(),以用作过滤器/查询的标记值.

我试过了:

OffsetDateTime.MIN.toInstant().toEpochMilli();
OffsetDateTime.MAX.toInstant().toEpochMilli();
Run Code Online (Sandbox Code Playgroud)

但我得到这个例外:

java.lang.ArithmeticException: long overflow

    at java.lang.Math.multiplyExact(Math.java:892)
    at java.time.Instant.toEpochMilli(Instant.java:1237)
Run Code Online (Sandbox Code Playgroud)

然后我尝试了这个:

ZonedDateTime.ofInstant(Instant.MIN, ZoneId.systemDefault());
ZonedDateTime.ofInstant(Instant.MAX, ZoneId.systemDefault());
Run Code Online (Sandbox Code Playgroud)

但后来我得到了这个例外:

java.time.DateTimeException: Invalid value for Year (valid values -999999999 - 999999999): -1000000001

    at java.time.temporal.ValueRange.checkValidIntValue(ValueRange.java:330)
    at java.time.temporal.ChronoField.checkValidIntValue(ChronoField.java:722)
    at java.time.LocalDate.ofEpochDay(LocalDate.java:341)
    at java.time.LocalDateTime.ofEpochSecond(LocalDateTime.java:422)
    at java.time.ZonedDateTime.create(ZonedDateTime.java:456)
    at java.time.ZonedDateTime.ofInstant(ZonedDateTime.java:409)
Run Code Online (Sandbox Code Playgroud)

我也试过'Z' ZoneId:

ZonedDateTime.ofInstant(Instant.MIN, ZoneId.of("Z"))
Run Code Online (Sandbox Code Playgroud)

但是返回与最后一个相同的异常.

最后我尝试了以下,它似乎工作:

ZonedDateTime.ofInstant(Instant.EPOCH, ZoneId.of("Z"));
ZonedDateTime.ofInstant(Instant.EPOCH.plusMillis(Long.MAX_VALUE), ZoneId.of("Z"));
Run Code Online (Sandbox Code Playgroud)

这是最好的解决方案吗?

java java-8 java-time

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

在Java 8中的LocalDateTime到java.sql.Date?

如何转换LocalDateTimejava.sql.Date

我的网上搜索大多是给我Timestamp相关的代码或LocalDatejava.sql.Date.我在寻找LocalDateTimejava.sql.Date.

datetime-conversion java-8 java-time

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