标签: java-8

Java8的蛋糕模式可能吗?

我只是想知道:使用Java 8,并且可以在接口中添加实现(有点像Scala特性),是否可以实现蛋糕模式,就像我们在Scala中可以做的那样?

如果是,有人可以提供代码片段吗?

java scala java-8 cake-pattern

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

Java SE 8 TemporalAccessor.from与java.time.Instant对象一起使用时出现问题

java.time有一个Instant类,它封装了时间轴上的位置(或"时刻").虽然我知道这是秒/纳秒值,因此与时区或时间偏移没有直接关系,但它toString返回格式为UTC日期/时间的日期和时间,例如2014-05-13T20:05:08.556Z.此外anInstant.atZone(zone),anInstant.atOffset(offset)两者都产生一个值,该值与将Instant具有隐含的UTC时区/"零"偏移量视为一致.

因此我原以为:

  • ZoneOffset.from(anInstant) 产生'零' ZoneOffset
  • OffsetDateTime.from(anInstant) 产生一个'零'偏移的日期/时间
  • ZoneId.from(anInstant) (可能)生成UTC ZoneId
  • ZonedDateTime.from(anInstant)(可能)ZonedDateTime用UTC 生成一个ZoneId

ZonedDateTime.from正如我所读到的那样,该文件似乎赞同这一点.

事实上ZoneOffset.from(anInstant)失败了DateTimeException,我想因为这个原因OffsetDateTime.from(anInstant)也失败了,其他两个也失败了.

这是预期的行为吗?

java java-8 java-time

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

FunctionalInterface Comparator有2个抽象方法

学习Java 8 Lambdas,只是想知道编译器如何知道Comparator中哪个方法用于lambda表达式?它似乎不是SAM接口?它有2个抽象方法:

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

30
推荐指数
2
解决办法
3753
查看次数

如何在通过lambda表达式应用过滤器后获取Stream的大小?

请考虑以下代码:

List<Locale> locales = Arrays.asList(
    new Locale("en", "US"),
    new Locale("ar"),
    new Locale("en", "GB")
); 

locales.stream().filter(l -> l.getLanguage() == "en");
Run Code Online (Sandbox Code Playgroud)

我如何获得的大小locales ArrayList 申请filter的,因为locales.size()给我的尺寸申请filter

java arrays lambda java-8

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

为什么原始Stream没有收集(收藏家)?

我正在为新手程序员编写一个库,所以我试图保持API尽可能干净.

我的库需要做的一件事就是对大量的int或long进行一些复杂的计算.我的用户需要从中计算这些值所需的大量场景和业务对象,因此我认为最好的方法是使用流来允许用户将业务对象映射到IntStream或者LongStream然后计算收集器内的计算.

但是IntStream和LongStream只有3参数collect方法:

collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
Run Code Online (Sandbox Code Playgroud)

而且没有简单的collect(Collector)方法Stream<T>.

所以不是能够做到的

Collection<T> businessObjs = ...
MyResult result = businessObjs.stream()
                              .mapToInt( ... )
                              .collect( new MyComplexComputation(...));
Run Code Online (Sandbox Code Playgroud)

我必须提供像这样的供应商,蓄电池和组合器:

MyResult result = businessObjs.stream()
                              .mapToInt( ... )
                              .collect( 
                                  ()-> new MyComplexComputationBuilder(...),
                                  (builder, v)-> builder.add(v),
                                  (a,b)-> a.merge(b))
                              .build(); //prev collect returns Builder object
Run Code Online (Sandbox Code Playgroud)

对于我的新手用户来说这太复杂了,而且非常容易出错.

我的工作是创建一个静态方法,它接受IntStreamLongStream作为输入,并为您隐藏收集器的创建和执行

public static MyResult compute(IntStream stream, ...){
       return .collect( 
                        ()-> new MyComplexComputationBuilder(...),
                        (builder, v)-> builder.add(v),
                        (a,b)-> a.merge(b))
               .build();
} …
Run Code Online (Sandbox Code Playgroud)

java api-design java-8 java-stream

30
推荐指数
2
解决办法
4811
查看次数

使用新的java.time API解析时区的速度非常慢

我只是将模块从旧的Java日期迁移到新的java.time API,并注意到性能大幅下降.它归结为用时区解析日期(我一次解析数百万个).

解析没有时区(yyyy/MM/dd HH:mm:ss)的日期字符串很快 - 比旧的Java日期快2倍,在我的电脑上每秒约1.5M操作.

但是,当模式包含时区(yyyy/MM/dd HH:mm:ss z)时,使用新java.timeAPI 的性能下降约15倍,而使用旧API时,性能与没有时区的速度一样快.请参阅下面的性能基准.

有没有人知道我是否能以某种方式使用新的java.timeAPI 快速解析这些字符串?目前,作为一种解决方法,我使用旧的API进行解析,然后将其转换Date为Instant,这不是特别好.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.concurrent.TimeUnit;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OperationsPerInvocation;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(1)
@Fork(1)
@Warmup(iterations = 3)
@Measurement(iterations = 5)
@State(Scope.Thread)
public class DateParsingBenchmark {

    private final int …
Run Code Online (Sandbox Code Playgroud)

java performance java-8 jmh java-time

30
推荐指数
2
解决办法
2195
查看次数

从sun.misc.BASE64迁移到Java 8 java.util.Base64

是Java 8 java.util.Base64MIME编码器和解码器一个下拉更换为不支持的,内部的Java API sun.misc.BASE64Encodersun.misc.BASE64Decoder

到目前为止我的想法和原因

根据我的调查和快速测试(见下面的代码),它应该是替代品,因为

  • sun.misc.BASE64Encoder基于其JavaDoc是RFC1521中规定的BASE64字符编码器.此RFC是MIME规范的一部分......
  • java.util.Base64基于JavaDoc 使用RFC 2045表1中指定的"Base64 Alphabet" 进行编码和解码操作...MIME下

假设RFC 1521和2045没有重大变化(我找不到任何变化)并且基于我使用Java 8 Base64 MIME编码器/解码器的快速测试应该没问题.

我在找什么

  • 确认或反驳"直接替换"点OR的权威来源
  • 一个反例,显示了java.util.Base64具有与sun.misc.BASE64Encoder OpenJDK Java 8实现(8u40-b25)(BASE64Decoder)不同的行为的情况
  • 你认为无论如何回答上述问题肯定

以供参考

我的测试代码

public class Base64EncodingDecodingRoundTripTest {

    public static void main(String[] args) throws IOException {
        String test1 = " ~!@#$%^& *()_+=`| }{[]\\;: \"?><,./ ";
        String test2 = test1 + test1;

        encodeDecode(test1);
        encodeDecode(test2);
    }

    static …
Run Code Online (Sandbox Code Playgroud)

java base64 encoding mime java-8

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

为什么我不能在Java 8 lambda表达式中抛出异常?

我升级到Java 8并试图用一个新的lamdba表达式替换一个简单的迭代迭代.循环搜索空值并在找到异常时抛出异常.旧的Java 7代码如下所示:

for (Map.Entry<String, String> entry : myMap.entrySet()) {
    if(entry.getValue() == null) {
        throw new MyException("Key '" + entry.getKey() + "' not found!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我将其转换为Java 8的尝试如下所示:

myMap.forEach((k,v) -> {
    if(v == null) {
        // OK
        System.out.println("Key '" + k+ "' not found!");

        // NOK! Unhandled exception type!
        throw new MyException("Key '" + k + "' not found!");
    }
});
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么throw这里不允许的声明以及如何纠正这个问题?

Eclipse的快速修复建议看起来并不合适......它只是throw用一个try-catch块来围绕语句:

myMap.forEach((k,v) -> {
    if(v == null) {
        try {
            throw new …
Run Code Online (Sandbox Code Playgroud)

java lambda exception java-8

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

java.util.function.Function.identity方法的实际用途是什么?

为什么我应该使用Function.identity()返回它收到的相同内容而不使用输入做任何事情或以某种方式修改输入?

Apple apple = new Apple(10, "green");
Function<Apple, Apple> identity = Function.identity();
identity.apply(apple);
Run Code Online (Sandbox Code Playgroud)

必须有一些实际用法,我无法弄清楚.

java java-8

30
推荐指数
2
解决办法
2191
查看次数

在继续流式传输时如何获得第一个元素?

我有一堆通用项目。我想打印第一个项目的类名+ toString()所有项目的类名。

如果我有一个Iterable,它将看起来像这样:

Iterable<E> itemIter = ...;
boolean first = true;
for (E e : itemIter) {
    if (first) {
        first = false;
        System.out.println(e.getClass().getSimpleName());
    }
    System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)

我可以Stream<T>使用流API 在流()上执行此操作吗?

*请注意,这是关于流的问题,而不是关于迭代器的问题。我有一个流-没有迭代器。

java java-8 java-stream

30
推荐指数
4
解决办法
1676
查看次数