你能用Java 8编译一个类,然后在Java 7中使用它吗?
我想用一个简单的接口(Java 7兼容)编写一个实用程序JAR,但是在里面使用lambdas.然后我想在一些必须用JDK 7编译的代码中使用该实用程序.
可能吗?
正如你所看到的,有一些相互矛盾的答案......所以,真相是什么?;-)
我正在研究Java代码,我需要在其中实现线程.我正在通过JAVA 8 API,我开始了解Stamped Locks.谁能告诉我为什么在多线程中使用StampedLocks?
提前致谢.
我试图在功能编程的新jdk8版本中做一些看起来相对基本的东西,但是无法让它工作.我有这个工作代码:
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.*;
public class so1 {
public static void main() {
List<Number> l = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Callable<Object>> checks = l.stream().
map(n -> (Callable<Object>) () -> {
System.out.println(n);
return null;
}).
collect(Collectors.toList());
}
}
Run Code Online (Sandbox Code Playgroud)
它需要一个数字列表并生成一个可以打印出来的函数列表.然而,显式转换为Callable似乎是多余的.对我和IntelliJ来说似乎.我们都同意这也应该有效:
List<Callable<Object>> checks = l.stream().
map(n -> () -> {
System.out.println(n);
return null;
}).
collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
so1.java:10: error: incompatible types: cannot infer type-variable(s) R
List<Callable<Object>> checks = l.stream().map(n -> () -> {System.out.println(n); return null;}).collect(Collectors.toList());
^
(argument mismatch; bad return type …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码片段:
public static Object o = new Object();
public static Callable x1() {
Object x = o;
return () -> x;
}
public static Callable x2() {
return () -> o;
}
Run Code Online (Sandbox Code Playgroud)
方法x2()将始终返回相同的lamba对象,而x1()始终会创建新的对象:
System.out.println(x1());
System.out.println(x1());
System.out.println(x2());
System.out.println(x2());
Run Code Online (Sandbox Code Playgroud)
会打印出这样的东西:
TestLambda$$Lambda$1/821270929@4a574795
TestLambda$$Lambda$1/821270929@f6f4d33
TestLambda$$Lambda$2/603742814@7adf9f5f
TestLambda$$Lambda$2/603742814@7adf9f5f
Run Code Online (Sandbox Code Playgroud)
哪里(在JVM规范中我猜?)是描述了这种lambda重用规则?JVM如何确定重用与否?
我有一系列双值,我想总结并获得最大值.这DoubleStream.summaryStatistics()听起来很完美.该getSum()方法有一个API注释提醒我在我的一个计算机科学课程中学到了什么:如果值按其绝对值排序,求和问题的稳定性往往会更好.但是,DoubleStream不允许我指定要使用的比较器,Double.compareTo如果我调用sorted()流,它将只使用.
因此,我将价值观收集到一个final Stream.Builder<Double> values = Stream.builder();电话中
values.build()
.sorted(Comparator.comparingDouble(Math::abs))
.mapToDouble(a -> a).summaryStatistics();
Run Code Online (Sandbox Code Playgroud)
然而,这看起来有点冗长,我宁愿使用DoubleStream.Builder而不是通用的构建器.我是否错过了某些内容或者我是否真的必须使用盒装版本的流才能指定比较器?
我需要以UTC格式保存并显示我的服务器中发生的事件的日期时间.我可以选择使用Instant.now()或LocalDateTime.now(ZoneOffset.UTC)
我什么时候应该更喜欢一个?
我有兴趣将一个流分成两个或多个子流,并以不同的方式处理这些元素.例如,(大)文本文件可能包含类型A的行和类型B的行,在这种情况下,我想要执行以下操作:
File.lines(path)
.filter(line -> isTypeA(line))
.forEachTrue(line -> processTypeA(line))
.forEachFalse(line -> processTypeB(line))
Run Code Online (Sandbox Code Playgroud)
以前是我试图抽象的情况.实际上我有一个非常大的文本文件,其中每一行都在测试正则表达式; 如果该行通过,则处理它,而如果它被拒绝,那么我想更新一个计数器.对拒绝字符串的进一步处理是我不仅仅使用的原因filter.
是否有任何合理的方法可以使用流来执行此操作,还是必须回退到循环?(我希望这也是并行运行,所以溪流是我的第一选择).
昨天我在Tomcat 8上部署我的Java 8 webapp后遇到了一个有趣的问题.我不想如何解决这个问题,而是更了解为什么会发生这种情况.但是,让我们从头开始.
我有两个类定义如下:
Foo.java
package package1;
abstract class Foo {
public String getFoo() {
return "foo";
}
}
Run Code Online (Sandbox Code Playgroud)
Bar.java
package package1;
public class Bar extends Foo {
public String getBar() {
return "bar";
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它们在同一个包中,并最终在同一个jar中,我们称之为commons.jar.这个jar是我的webapp的依赖(即在我的webapp的pom.xml中被定义为依赖).
在我的webapp中,有一段代码可以:
package package2;
public class Something {
...
Bar[] sortedBars = bars.stream()
.sorted(Comparator.comparing(Bar::getBar)
.thenComparing(Bar::getFoo))
.toArray(Bar[]::new);
...
}
Run Code Online (Sandbox Code Playgroud)
当它被执行时,我得到:
java.lang.IllegalAccessError: tried to access class package1.Foo from class package2.Something
Run Code Online (Sandbox Code Playgroud)
玩耍和试验我能够通过三种方式避免错误:
将Foo类更改为public而不是package-private;
将Something类的包更改为"package1"(即字面上与Foo和Bar类相同,但物理上不同的是webapp中定义的Something类);
在执行违规代码之前强制加载Foo:
try {
Class<?> fooClass = Class.forName("package1.Foo");
} …Run Code Online (Sandbox Code Playgroud)我正在使用3d派对库,他们返回缺少类型规范的集合(例如public List getFoo();),并且我正在尝试转换它们的返回类型并返回具有适当类型的列表.
我创建了一个演示问题的简单示例.例如
编辑原始问题将l2声明为a ArrayList而不是a List,现在已更正.
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
public class Foo {
public static void main(String[] args) {
ArrayList l = new ArrayList();
l.add(1);
l.add(2);
List<String> l2 = l.stream().map(Object::toString).collect(Collectors.toList());
}
}
Run Code Online (Sandbox Code Playgroud)
这无法编译.
$ javac Foo.java
Foo.java:10: error: incompatible types: Object cannot be converted to List<String>
List<String> l2 = l.stream().map(Object::toString).collect(Collectors.toList());
^
1 error
Run Code Online (Sandbox Code Playgroud)
如果我稍微修改程序,那么它编译,我可以检查流/收集操作的返回类型.虽然我不得不施展结果,但它"有效".
例如
import java.util.ArrayList;
import java.util.stream.Collectors;
public class Foo {
public static void main(String[] args) {
ArrayList l …Run Code Online (Sandbox Code Playgroud) 得到ZoneId它像:
ZoneId.of("America/Sao_Paulo");
Run Code Online (Sandbox Code Playgroud)
要么
ZoneId.of(ZoneId.SHORT_IDS.get("BET"));
Run Code Online (Sandbox Code Playgroud)
为什么不存在Enum这样的价值的原因,如:
ZoneId.of(ZoneIds.AMERICA_SAO_PAULO);
Run Code Online (Sandbox Code Playgroud)
这似乎不容易出错,而且更加自动完成友好?