Java 14是非 LTS。
考虑到 6 个月发布的新版本序列,并且 8 和 11 是 LTS,Java 14 不应该是下一个 LTS 版本吗?
还是纯粹基于 Java 架构师来决定他们为 LTS 选择哪个?
我确实在网上搜索过,但找不到答案。
Java 8引入了Lambda表达式和Type Annotations.
使用类型注释,可以定义Java注释,如下所示:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface MyTypeAnnotation {
public String value();
}
Run Code Online (Sandbox Code Playgroud)
然后可以在任何类型引用上使用此注释,例如:
Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() {
@Override
public void accept(String str) {
System.out.println(str);
}
};
Run Code Online (Sandbox Code Playgroud)
这是一个完整的例子,它使用这个注释来打印"Hello World":
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.AnnotatedType;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class Java8Example {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface MyTypeAnnotation {
public String value();
}
public static void main(String[] args) {
List<String> list = Arrays.asList("World!", "Type Annotations!"); …Run Code Online (Sandbox Code Playgroud) 我正在玩Java 8的流,无法理解我得到的性能结果.我有2个核心CPU(Intel i73520M),Windows 8 x64和64位Java 8更新5.我正在做简单的字符串流/并行流Strings,发现并行版本有点慢.
Function<Stream<String>, Long> timeOperation = (Stream<String> stream) -> {
long time1 = System.nanoTime();
final List<String> list =
stream
.map(String::toLowerCase)
.collect(Collectors.toList());
long time2 = System.nanoTime();
return time2 - time1;
};
Consumer<Stream<String>> printTime = stream ->
System.out.println(timeOperation.apply(stream) / 1000000f);
String[] array = new String[1000000];
Arrays.fill(array, "AbabagalamagA");
printTime.accept(Arrays.stream(array)); // prints around 600
printTime.accept(Arrays.stream(array).parallel()); // prints around 900
Run Code Online (Sandbox Code Playgroud)
考虑到我有2个CPU内核的事实,并行版本不应该更快吗?有人能给我一个暗示为什么并行版本更慢?
我知道他们已经用Java 8中的MetaSpace取代了PermGen.但我几乎没有问题:
-XX:+CMSClassUnloadingEnabled,那么是什么让MetaSpace比PermGen更好?OutOfMemoryException.提前致谢
在Java 8之前,可以通过使用匿名内部类来实现lambda功能.例如:
interface Lambda {
void doStuff();
}
// ...
public void doWithCallback(Lambda callback) {
// ...
callback.doStuff();
}
// ...
doWithCallback(new Lambda {
public void doStuff() {
// ...
}
});
Run Code Online (Sandbox Code Playgroud)
在性能方面,仍然使用这种方法和使用新的Java 8 lambda之间有区别吗?
这些之间有什么区别:
zonedDateTime.truncatedTo(ChronoUnit.DAYS);
zonedDateTime.toLocalDate().atStartOfDay(zonedDateTime.getZone());
Run Code Online (Sandbox Code Playgroud)
有理由偏爱另一个吗?
谢谢
为了更好地理解新流API我试图转换一些旧代码,但我坚持这个.
public Collection<? extends File> asDestSet() {
HashMap<IFileSourceInfo, Set<File>> map = new HashMap<IFileSourceInfo, Set<File>>();
//...
Set<File> result = new HashSet<File>();
for (Set<File> v : map.values()) {
result.addAll(v);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法为它创建一个有效的收集器:
public Collection<? extends File> asDestSet() {
HashMap<IFileSourceInfo, Set<File>> map = new HashMap<IFileSourceInfo, Set<File>>();
//...
return map.values().stream().collect(/* what? */);
}
Run Code Online (Sandbox Code Playgroud) 阅读一篇有趣的文章,这些人声称这两个功能的区别在于:
如果Map中没有指定的Key,则两个函数都希望添加元素.
putIfAbsent添加具有指定Value的元素,而computeIfAbsent添加具有使用Key计算的值的元素. http://www.buggybread.com/2014/10/java-8-difference-between-map.html
和
我们已经看到putIfAbsent删除了必须定义if语句的必要方法,但是如果获取Java文章真的会损害我们的性能呢?
为了优化这一点,我们不想在我们确定需要它们之前获取文章 - 这意味着在获取文章之前我们需要知道密钥是否缺失. http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/
我还没准备好了解哪些差异可以请你详细说明这两个功能?
在Java 8中添加了Lambda表达式.我想理解为什么这很重要.对于尚未接触函数式编程习惯用语的Java程序员来说,这意味着什么?这是否意味着我可以编写性能更好或大规模扩展的代码,或者只是使代码更简洁.或者全部.
是否可以在新java.timeAPI中获取两个日期之间的所有日期?
假设我有这部分代码:
@Test
public void testGenerateChartCalendarData() {
LocalDate startDate = LocalDate.now();
LocalDate endDate = startDate.plusMonths(1);
endDate = endDate.withDayOfMonth(endDate.lengthOfMonth());
}
Run Code Online (Sandbox Code Playgroud)
现在我需要startDate和之间的所有日期endDate.
我想要得到daysBetween两个日期并迭代:
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
for(int i = 0; i <= daysBetween; i++){
startDate.plusDays(i); //...do the stuff with the new date...
}
Run Code Online (Sandbox Code Playgroud)
有更好的方法来获取日期吗?
java ×10
java-8 ×10
java-stream ×2
java-time ×2
lambda ×2
performance ×2
annotations ×1
closures ×1
date ×1
datetime ×1
java-11 ×1
java-14 ×1
lts ×1