小编Mar*_*rcG的帖子

如何从Java 8流中抛出CHECKED异常?

如何从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.

java lambda checked-exceptions java-8 java-stream

270
推荐指数
10
解决办法
11万
查看次数

将两个Java 8流或一个额外元素添加到流中

我可以添加流或额外的元素,如下所示:

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)无论如何,有没有更好的方法呢?

java concat java-8 java-stream

162
推荐指数
4
解决办法
11万
查看次数

如何在Flutter中停用或覆盖Android"BACK"按钮?

有没有办法在特定页面上停用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秒钟,否则我希望没有可能的方法离开此屏幕.(我正在尝试为幼儿写一个应用程序,并希望只有父母能够导航出特定的屏幕).

flutter

56
推荐指数
8
解决办法
2万
查看次数

Collectors.groupingBy不接受null键

在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)是否有另一种更简单的方法来接受一个空键,而不必创建我自己的收集器?

java hashmap java-8 java-stream collectors

39
推荐指数
3
解决办法
2万
查看次数

如何覆盖Flutter中的"后退"按钮?

在我的Home小部件上,当用户点击系统后退按钮时,我想显示一个确认对话框,询问"你想要退出应用程序吗?"

我不明白我应该如何覆盖或处理系统后退按钮.

flutter

38
推荐指数
1
解决办法
3万
查看次数

如何使用Java 8流和自定义列表和地图供应商将List <V>转换为Map <K,List <V >>?

它很容易转换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)

但我想与自己ListMap 供应商合作.

我想出了这个:

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供应商,该怎么办?

java java-stream collectors

24
推荐指数
2
解决办法
2万
查看次数

获取类的所有方法的新方法是什么,包括Java 8的继承默认方法?

我想获取类的所有方法,包括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或类名:

  • 包括在类本身中声明的public,protected,package和private方法.
  • 包括其超类的受保护方法.
  • 包括同一包的超类的包方法.
  • 包括其接口的默认方法(未覆盖/隐藏的方法,请参见此处此处).
  • 包含具有适当可访问性的静态方法(类和超类). …

java reflection inheritance java-8

19
推荐指数
1
解决办法
5387
查看次数

Force Flutter重绘所有小部件

有没有办法强制Flutter重绘所有小部件(例如在区域设置更改后)?

dart flutter

19
推荐指数
8
解决办法
3万
查看次数

在 Flutter 中,定位的 Widget 如何感觉在其父 Stack 区域之外的点击?

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.visibleMyWidget比大Stack,它显示之外的Stack,这就是我想要的。

但是,我无法在区域MyWidget外的Stack区域中点击。它只是忽略了那里的水龙头。

我如何确保MyWidget在那里接受手势?

gesture flutter flutter-layout

18
推荐指数
5
解决办法
8994
查看次数

14
推荐指数
2
解决办法
3702
查看次数