如何从Java 8流/ lambdas中抛出CHECKED异常?
换句话说,我想像这样编译代码:
public List<Class> getClasses() throws ClassNotFoundException {
List<Class> classes =
Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.map(className -> Class.forName(className))
.collect(Collectors.toList());
return classes;
}
Run Code Online (Sandbox Code Playgroud)
此代码无法编译,因为Class.forName()
上面的方法抛出ClassNotFoundException
,检查.
请注意我不希望将已检查的异常包装在运行时异常中,而是抛出包装的未经检查的异常.我想抛出已检查的异常本身,而不是向流添加丑陋的try
/ catches
.
我可以添加流或额外的元素,如下所示:
Stream stream = Stream.concat(stream1, Stream.concat(stream2, Stream.of(element));
Run Code Online (Sandbox Code Playgroud)
我可以随时添加新内容,如下所示:
Stream stream = Stream.concat(
Stream.concat(
stream1.filter(x -> x!=0), stream2)
.filter(x -> x!=1),
Stream.of(element))
.filter(x -> x!=2);
Run Code Online (Sandbox Code Playgroud)
但这很难看,因为它concat
是静态的.如果concat
是实例方法,上面的示例将更容易阅读:
Stream stream = stream1.concat(stream2).concat(element);
Run Code Online (Sandbox Code Playgroud)
和
Stream stream = stream1
.filter(x -> x!=0)
.concat(stream2)
.filter(x -> x!=1)
.concat(element)
.filter(x -> x!=2);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1)concat
静态有什么好的理由吗?或者是否有一些我缺少的等效实例方法?
2)无论如何,有没有更好的方法呢?
有没有办法在特定页面上停用Android后退按钮?
class WakeUpApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Time To Wake Up ?",
home: new WakeUpHome(),
routes: <String, WidgetBuilder>{
'/pageOne': (BuildContext context) => new pageOne(),
'/pageTwo': (BuildContext context) => new pageTwo(),
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
在pageOne上我有一个按钮可以转到pageTwo:
new FloatingActionButton(
onPressed: () {
Navigator.of(context).pushNamed('/pageTwo');
},
)
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我按下Android屏幕底部的后退箭头,我会回到pageOne.我希望这个按钮根本不显示.理想情况下,除非用户将手指按在屏幕上5秒钟,否则我希望没有可能的方法离开此屏幕.(我正在尝试为幼儿写一个应用程序,并希望只有父母能够导航出特定的屏幕).
在Java 8中,这适用于:
Stream<Class> stream = Stream.of(ArrayList.class);
HashMap<Class, List<Class>> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass));
Run Code Online (Sandbox Code Playgroud)
但这不是:
Stream<Class> stream = Stream.of(List.class);
HashMap<Class, List<Class>> map = (HashMap)stream.collect(Collectors.groupingBy(Class::getSuperclass));
Run Code Online (Sandbox Code Playgroud)
Maps允许null键,List.class.getSuperclass()返回null.但Collectors.grouping可以在Collectors.java第907行发出NPE:
K key = Objects.requireNonNull(classifier.apply(t), "element cannot be mapped to a null key");
Run Code Online (Sandbox Code Playgroud)
如果我创建自己的收集器,它的工作原理改为:
K key = classifier.apply(t);
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1)Collectors的Javadoc.GroupingBy并没有说它不应该映射一个空键.出于某种原因这种行为是否必要?
2)是否有另一种更简单的方法来接受一个空键,而不必创建我自己的收集器?
在我的Home小部件上,当用户点击系统后退按钮时,我想显示一个确认对话框,询问"你想要退出应用程序吗?"
我不明白我应该如何覆盖或处理系统后退按钮.
它很容易转换List<V>
成Map<K, List<V>>
.例如:
public Map<Integer, List<String>> getMap(List<String> strings) {
return
strings.stream()
.collect(Collectors.groupingBy(String::length));
}
Run Code Online (Sandbox Code Playgroud)
但我想与自己List
和Map
供应商合作.
我想出了这个:
public Map<Integer, List<String>> getMap(List<String> strings) {
return strings.stream()
.collect(Collectors.toMap(
String::length,
item -> {List<String> list = new ArrayList<>(); list.add(item); return list;},
(list1, list2) -> {list1.addAll(list2); return list1;},
HashMap::new));
}
Run Code Online (Sandbox Code Playgroud)
问题:是否有更简单,更简洁,更有效的方法?例如,像这样的东西(不起作用):
return strings.stream()
.collect(Collectors.toMap(
String::length,
ArrayList::new,
HashMap::new));
Run Code Online (Sandbox Code Playgroud)
如果我只需要定义List
供应商而不是Map
供应商,该怎么办?
我想获取类的所有方法,包括public,protected,package和private方法,以及包括继承的方法.
记得:
Class.getDeclaredMethods()
获取public,protected,package和private方法,但不包括继承的方法.Class.getMethods
获取继承的方法,但只获取公共方法.在Java 8之前,我们可以做一些事情:
Collection<Method> found = new ArrayList<Method>();
while (clazz != null) {
for (Method m1 : clazz.getDeclaredMethods()) {
boolean overridden = false;
for (Method m2 : found) {
if (m2.getName().equals(m1.getName())
&& Arrays.deepEquals(m1.getParameterTypes(), m2
.getParameterTypes())) {
overridden = true;
break;
}
}
if (!overridden) found.add(m1);
}
clazz = clazz.getSuperclass();
}
return found;
Run Code Online (Sandbox Code Playgroud)
但是现在,如果类使用默认方法实现某些接口而不被具体超类覆盖,则这些方法将逃避上述检测.此外,现在有关于具有相同名称的默认方法的规则,并且还必须考虑这些规则.
问题:获取类的所有方法的当前推荐方法是什么:
"all"的最常见定义应该是可以在类的实例方法中直接访问的方法,而不使用super
或类名:
AStack
包含MyWidget
在 a 内部Positioned
。
Stack(
overflow: Overflow.visible,
children: [
Positioned(
top: 0.0,
left: 0.0,
child: MyWidget(),
)],
);
Run Code Online (Sandbox Code Playgroud)
由于溢出Overflow.visible
而MyWidget
比大Stack
,它显示之外的Stack
,这就是我想要的。
但是,我无法在区域MyWidget
外的Stack
区域中点击。它只是忽略了那里的水龙头。
我如何确保MyWidget
在那里接受手势?
Object
+ shortcut
➜Object object = new Object();
是否有这样的捷径?
java ×5
flutter ×4
java-8 ×4
java-stream ×4
collectors ×2
autocomplete ×1
concat ×1
dart ×1
gesture ×1
hashmap ×1
inheritance ×1
lambda ×1
new-operator ×1
object ×1
reflection ×1
shortcut ×1