标签: java-8

C#lambda在java 8中选择

假设我在C#中有一个对象:

public class Person
{
    public string Name{get;set;}
    public int Age{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

要在C#中从此列表中选择名称,我将执行以下操作:

List<string> names = person.Select(x=>x.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

我如何在Java 8中做同样的事情?

c# java java-8

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

Arrays.stream().map().sum()的不稳定性能

我偶然发现了一个非常不稳定的性能曲线实例,它对原始数组进行了非常简单的map/reduce操作.这是我的jmh基准代码:

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(Measure.ARRAY_SIZE)
@Warmup(iterations = 300, time = 200, timeUnit=MILLISECONDS)
@Measurement(iterations = 1, time = 1000, timeUnit=MILLISECONDS)
@State(Scope.Thread)
@Threads(1)
@Fork(1)
public class Measure
{
  static final int ARRAY_SIZE = 1<<20;
  final int[] ds = new int[ARRAY_SIZE];

  private IntUnaryOperator mapper;

  @Setup public void setup() {
    setAll(ds, i->(int)(Math.random()*(1<<7)));
    final int multiplier = (int)(Math.random()*10);
    mapper = d -> multiplier*d;
  }

  @Benchmark public double multiply() {
    return Arrays.stream(ds).map(mapper).sum();
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是典型输出的片段:

# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/jre/bin/java
# VM options: <none>
# Warmup: 300 iterations, …
Run Code Online (Sandbox Code Playgroud)

java java-8 jmh

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

DateTimeFormatter支持单个数字日和月份的日期

DateTimeFormmater 似乎没有处理该月的单个数字日:

String format = "MM/dd/yyyy";
String date   = "5/3/1969";
System.out.println(new SimpleDateFormat(format).parse(date));
System.out.println(LocalDate.parse(date, DateTimeFormatter.ofPattern(format)));
Run Code Online (Sandbox Code Playgroud)

在此示例中,SimpleDateFormat正确解析日期,但DateTimeFormatter会引发异常.如果我使用零填充日期,例如"05/03/1969",两者都有效.但是,如果月中的某一天或一年中的DateTimeFormatter某个月是单个数字,则抛出异常.

DateTimeFormatter解析每月和每月的一位和两位数的正确格式是什么?

java date java-8 java-time

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

LocalDateTime删除毫秒

我在Java应用程序中工作,我正在使用Java 8.

我已经集成了数据库(多个数据库Oracle,Mysql,Postgres)以及DB i中创建日期的字符串.

DB中的日期格式为 - 2015-07-29 16:23:28.143

我从DB获取此文件并在Localdatetime对象中设置

myObj.setCreated(rs.getTimestamp("created").toLocalDateTime());
Run Code Online (Sandbox Code Playgroud)

所以这里的问题是我不想在响应中显示/发送毫秒.我想显示/发送日期,如2015-07-29 16:23:28

我尝试了格式化程序,但它失败了,因为它给了字符串,我不想将LocalDateTime对象更改为String,因为这会导致所有Java应用程序发生重大变化.所以想找到解决方案

任何人都可以知道任何解决方案.

java database date java-8

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

为什么我们不能在lambda表达式中使用默认方法?

在Java 8上阅读本教程,其中作者展示了代码:

interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后说

无法从lambda表达式中访问默认方法.以下代码无法编译:

Formula formula = (a) -> sqrt( a * 100);
Run Code Online (Sandbox Code Playgroud)

但他没有解释为什么不可能.我运行了代码,它给出了一个错误,

不兼容的类型:公式不是功能接口`

那么为什么不可能或错误的含义是什么?该接口满足具有一种抽象方法的功能接口的要求.

java lambda interface java-8 default-method

42
推荐指数
3
解决办法
7698
查看次数

是否有类可选但非选项类?

声明函数来映射值并在它们存在时使用它们是很方便的.

在你有几个强制对象和几个Optionals的情况下,我发现自己将其他包装在Optional.of(mandatoryObject)中,所以我可以在它们上使用相同的表达式而不用向后写它们.

Food vegetables = Food.someVegetables();
Optional<Food> condiment = Food.someCondiment();
Optional<Food> spices = Food.someSpices();

condiment.map(prepare).ifPresent(putOnPlate);
spices.map(prepare).ifPresent(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

但后来我不喜欢这段代码:

putOnPlate.accept(prepare.apply(vegetables));
Run Code Online (Sandbox Code Playgroud)

所以我把它包起来:

Optional.of(vegetables).map(prepare).ifPresent(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

但这是错误的,因为蔬菜(在这个例子中)实际上不是可选的.它们非常重要,我给大家的印象是它们是可选的.

所以我的问题是:java中有一些类如java.util.Mandatory,所以我可以写:

Mandatory.of(vegetables).map(prepare).definitelyPresentSo(putOnPlate);
Run Code Online (Sandbox Code Playgroud)

java optional java-8

42
推荐指数
2
解决办法
1891
查看次数

什么是Java流中的"escape-hatch操作"?

我正在阅读Java文档并遇到这句话:

除了转义舱口的操作iterator()spliterator(),被调用的终端操作时开始执行,并且终端操作完成时结束.

我不确定"逃生舱操作"是什么意思.有人可以解释一下这个词吗?

java java-8 java-stream

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

LocalDateTime的长时间戳

我有一个很长的时间戳1499070300(相当于周一,2017年7月3日16:25:00 +0800)但是当我将它转换为LocalDateTime时,我得到1970-01-18T16:24:30.300

这是我的代码

long test_timestamp = 1499070300;

LocalDateTime triggerTime =
                LocalDateTime.ofInstant(Instant.ofEpochMilli(test_timestamp), TimeZone
                        .getDefault().toZoneId());
Run Code Online (Sandbox Code Playgroud)

java timestamp java-8 java-time

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

使用Java 8减少链接的最佳方式

我有以下代码,我正在努力改进:

BigDecimal total = entity.getAssociate().stream().map(Associates::getPropertyA)
    .reduce(BigDecimal.ZERO, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyB)
    .reduce(total, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyC)
    .reduce(total, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyD)
    .reduce(total, BigDecimal::add);
Run Code Online (Sandbox Code Playgroud)

它有效,但它确实有一个更好的方法来做到这一点.有人可以就此事启发我吗?

java java-8

42
推荐指数
5
解决办法
2564
查看次数

Java流映射和收集 - 生成的容器的顺序

List<MyObject> myList = new ArrayList<>(); 
//populate myList here

List<String> nameList = myList.stream()
        .map(MyObject::getName)
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我可以期望MyObject名称nameList的顺序总是与顺序相同myList吗?

java list java-8 java-stream

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