我想采用现有的枚举并添加更多元素,如下所示:
enum A {a,b,c}
enum B extends A {d}
/*B is {a,b,c,d}*/
Run Code Online (Sandbox Code Playgroud)
这在Java中可行吗?
有时您想要Stream
使用多个条件过滤a :
myList.stream().filter(x -> x.size() > 10).filter(x -> x.isCool()) ...
Run Code Online (Sandbox Code Playgroud)
或者你可以用复杂的条件和单一的方式 做同样的事情filter
:
myList.stream().filter(x -> x.size() > 10 && x -> x.isCool()) ...
Run Code Online (Sandbox Code Playgroud)
我的猜测是第二种方法具有更好的性能特征,但我不知道.
第一种方法在可读性方面取胜,但性能更好?
在带有lambda b93的JDK 8中,b93中有一个类java.util.stream.Streams.zip可用于压缩流(这在教程Exploring Java8 Lambdas中说明.Dhananjay Nene的第1部分).这个功能:
创建一个惰性和顺序组合Stream,其元素是组合两个流的元素的结果.
然而在b98中,这已经消失了.事实上,在b98Streams
中的java.util.stream中甚至无法访问该类.
是否已移动此功能,如果是这样,我如何使用b98简洁地压缩流?
我想到的应用程序是在Shen的这个java实现中,我在其中替换了zip中的zip功能
static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
具有相当冗长代码的函数(不使用b98中的功能).
lambda functional-programming lazy-evaluation java-8 java-stream
是否有一个API来获取类路径资源(例如我得到的Class.getResource(String)
)作为一个java.nio.file.Path
?理想情况下,我想使用奇特的新Path API和类路径资源.
到目前为止,我认为有效的 final和final或多或少是等效的,如果在实际行为中不相同,JLS 会将它们相似地对待。然后我发现了这个人为的场景:
final int a = 97;
System.out.println(true ? a : 'c'); // outputs a
// versus
int a = 97;
System.out.println(true ? a : 'c'); // outputs 97
Run Code Online (Sandbox Code Playgroud)
显然,JLS 在这里两者之间产生了重要区别,我不知道为什么。
我阅读了其他主题,例如
但他们没有详细说明。毕竟,在更广泛的层面上,它们似乎几乎是等价的。但深入挖掘,它们显然不同。
是什么导致了这种行为,谁能提供一些解释这一点的 JLS 定义?
编辑:我发现了另一个相关的场景:
final String a = "a";
System.out.println(a + "b" == "ab"); // outputs true
// versus
String a = "a";
System.out.println(a + "b" == "ab"); // outputs false
Run Code Online (Sandbox Code Playgroud)
所以字符串实习在这里的行为也不同(我不想在实际代码中使用这个片段,只是对不同的行为感到好奇)。
我有一个第三方图书馆给了我一个Enumeration<String>
.我想懒洋洋地与枚举工作作为Java 8 Stream
,呼叫之类的东西filter
,map
并flatMap
在其上.
是否有现有的库?我已经引用了Guava和Apache Commons,所以如果其中任何一个都有理想的解决方案.
或者,是什么把一个最好/最简单的方式Enumeration
进入Stream
,同时保留所有的懒惰天性?
When compiling the code below with the Java compiler from OpenJDK 8, the call to foo()
is done via an invokespecial
, but when OpenJDK 11 is used, an invokevirtual
is emitted.
public class Invoke {
public void call() {
foo();
}
private void foo() {}
}
Run Code Online (Sandbox Code Playgroud)
Output of javap -v -p
when javac
1.8.0_282 is used:
public void call();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #2 // Method foo:()V
4: return
Run Code Online (Sandbox Code Playgroud)
Output …
我有一个Foo
包含这些字段的课程:
id:int/name; String/targetCost:BigDecimal/actualCost:BigDecimal
我得到了这个类的对象的arraylist.例如:
new Foo(1, "P1", 300, 400),
new Foo(2, "P2", 600, 400),
new Foo(3, "P3", 30, 20),
new Foo(3, "P3", 70, 20),
new Foo(1, "P1", 360, 40),
new Foo(4, "P4", 320, 200),
new Foo(4, "P4", 500, 900)
Run Code Online (Sandbox Code Playgroud)
我想通过创建"targetCost"和"actualCost"的总和并将"行"分组来转换这些值,例如
new Foo(1, "P1", 660, 440),
new Foo(2, "P2", 600, 400),
new Foo(3, "P3", 100, 40),
new Foo(4, "P4", 820, 1100)
Run Code Online (Sandbox Code Playgroud)
我现在写的:
data.stream()
.???
.collect(Collectors.groupingBy(PlannedProjectPOJO::getId));
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我们可以发现hashcode
的list
是本身含有的element
?
我知道这是一个不好的做法,但这是面试官问的。
当我运行以下代码时,它会抛出一个StackOverflowError
:
public class Main {
public static void main(String args[]) {
ArrayList<ArrayList> a = new ArrayList();
a.add(a);
a.hashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有两个问题:
StackOverflowError
?由于已经知道它很容易地添加序列化支持lambda表达式时,目标接口已经不继承Serializable
,只是喜欢(TargetInterface&Serializable)()->{/*code*/}
.
我问,是一种反其道而行之,明确删除支持串行当目标接口不继承Serializable
.
由于您无法从类型中删除接口,因此基于语言的解决方案可能看起来像(@NotSerializable TargetInterface)()->{/* code */}
.但据我所知,没有这样的解决方案.(纠正我,如果我错了,这将是一个完美的答案)
即使在类实现时拒绝序列化是Serializable
过去的合法行为,并且程序员控制下的类,模式看起来如下:
public class NotSupportingSerialization extends SerializableBaseClass {
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
throw new NotSerializableException();
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
throw new NotSerializableException();
}
private void readObjectNoData() throws ObjectStreamException {
throw new NotSerializableException();
}
}
Run Code Online (Sandbox Code Playgroud)
但是对于lambda表达式,程序员没有对lambda类的控制.
为什么有人会费心去除支持?好吧,除了生成包含Serialization
支持的更大代码之外,它还会产生安全风险.请考虑以下代码:
public class CreationSite {
public static void main(String... arg) {
TargetInterface f=CreationSite::privateMethod;
} …
Run Code Online (Sandbox Code Playgroud)