我想解决以下问题:
从集合A开始,我想将该集合(比如集合B)上的某种"视图"传递给某个方法.视图B不必包含原始集合A的所有元素.如果在此方法中将对象添加到视图(集合B)或从视图中删除,则这些更改也应反映在原始集合A上.
例如(伪代码):
开始情况:
Collection A = {1, 2, 3};
View-on-collection B = {1, 2};
Run Code Online (Sandbox Code Playgroud)方法调用:
someMethod(B) {
B.add(4);
B.remove(2);
}
Run Code Online (Sandbox Code Playgroud)结束情况:
Collection A = {1, 3, 4};
Run Code Online (Sandbox Code Playgroud)有谁知道这个问题的巧妙解决方案?
这个问题是针对 Tomcat 的,但一般适用于其他应用程序服务器 / Servlet 容器的答案也会很有趣。
根据我的理解,可以保证每个请求都由来自请求处理线程池的单个线程处理(让我们忽略应用程序请求处理代码异步执行某些工作的情况)。
但我想知道的是,如果保证一个线程只会一个请求在同一时间?
换句话说,是否有可能抢占在线程 T1 上执行的请求 R1 的工作,然后使用该线程 T1 处理请求 R2,然后在 T1 上继续处理 R1 ?
可能这个问题可以更概括为:在线程 T1 上执行 Runnable R1 是否可以“抢占”以支持在同一线程T1上执行另一个 Runnable R2 ?
我无法摆脱那种唠叨的感觉,即我只是忽略了 Java 中多线程的某种基本原则,所以请赐教!
我知道我们可以将函数转换为Serializable需要它的位置.
但是,我想将此转换移动到通用方法,以使使用代码更简洁.我无法创建这样的方法.
我的具体问题是下面的地图不是Serializable:
final Map<MyObject, String> map =
new TreeMap<>(Comparator.comparing(MyObject::getCode));
Run Code Online (Sandbox Code Playgroud)
我可以通过使用:
final Map<MyObject, String> map =
new TreeMap<>(Comparator.comparing((Function<MyObject, String> & Serializable) MyObject::getCode));
Run Code Online (Sandbox Code Playgroud)
但我希望能够做到这样的事情:
final Map<MyObject, String> map =
new TreeMap<>(Comparator.comparing(makeSerializable(MyObject::getCode)));
public static <T, U> Function<T, U> makeSerializable(Function<T, U> function) {
return (Function<T, U> & Serializable) function;
}
Run Code Online (Sandbox Code Playgroud)
对于编译器这很好,但在运行时,我得到一个ClassCastException:
java.lang.ClassCastException: SerializableTest$$Lambda$1/801197928 cannot be cast to java.io.Serializable
Run Code Online (Sandbox Code Playgroud)
我也尝试了以下替代方案,但没有成功:
// ClassCastException
public static <T extends Serializable, U extends Serializable> Function<T, U> makeSerializable(Function<T, U> …Run Code Online (Sandbox Code Playgroud)