假设我在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中做同样的事情?
我偶然发现了一个非常不稳定的性能曲线实例,它对原始数组进行了非常简单的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) 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应用程序中工作,我正在使用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应用程序发生重大变化.所以想找到解决方案
任何人都可以知道任何解决方案.
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)
但他没有解释为什么不可能.我运行了代码,它给出了一个错误,
不兼容的类型:公式不是功能接口`
那么为什么不可能或错误的含义是什么?该接口满足具有一种抽象方法的功能接口的要求.
声明函数来映射值并在它们存在时使用它们是很方便的.
在你有几个强制对象和几个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文档并遇到这句话:
除了转义舱口的操作
iterator()和spliterator(),被调用的终端操作时开始执行,并且终端操作完成时结束.
我不确定"逃生舱操作"是什么意思.有人可以解释一下这个词吗?
我有一个很长的时间戳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) 我有以下代码,我正在努力改进:
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)
它有效,但它确实有一个更好的方法来做到这一点.有人可以就此事启发我吗?
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吗?