小编Hol*_*ger的帖子

用于解决fibonacci的Java 8 Lambda表达式(非递归方式)

我是Java 8中使用Lambda表达式功能的初学者.Lambda表达式在解决Prime数字检查,阶乘等程序方面非常有用.

然而,它们可以有效地用于解决像Fibonacci这样的问题,其中当前值取决于前两个值的总和.我已经很好地使用Lambda表达式有效地解决了素数检查问题.下面给出了相同的代码.

boolean checkPrime=n>1 && LongStream.range(2, (long) Math.sqrt(n)).parallel().noneMatch(e->(n)%e==0);
Run Code Online (Sandbox Code Playgroud)

在方法的上述代码中,noneMatch我们使用范围中的当前值(e)进行评估.但对于Fibonacci问题,我们需要前两个值.

我们怎样才能实现呢?

java lambda functional-programming java-8 java-stream

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

使用流将booleans的Object []转换为boolean []

我可以用这样的代码进行转换:

Object[] array = (Object[]) message.get(key);
boolean[] result = new boolean[array.length];
for (int i = 0; i < array.length; i++) {
    result[i] = (boolean) array[i];
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为可以使用Java 8流进行相同的转换.我开始编写这样的代码:

boolean[] =  Arrays.stream(array)
                   .map(Boolean.class::cast)
                   .map(Boolean::booleanValue)
                   .toArray()
Run Code Online (Sandbox Code Playgroud)

但是这段代码不起作用.编译说

incompatible types: java.lang.Object[] cannot be converted to boolean[]
Run Code Online (Sandbox Code Playgroud)

我试图了解代码的问题.我认为这map(Boolean::booleanValue)将返回我可以收集的布尔值流toArray.

java arrays java-stream

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

通过Java Stream汇总ArrayList <Double>

我试图弄清楚如何总结'ArrayList'的所有元素.

我已经尝试过了:

 double totalevent = myList.stream().mapToDouble(f -> f).sum();
Run Code Online (Sandbox Code Playgroud)

虽然myList是一个ArrayList<Double>.

没有无用的mapToDouble功能有没有办法做到这一点?

double java-8 java-stream

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

Stream上的收集操作是否会关闭流和底层资源?

以下代码是否需要包含在try-with-resources中以确保底层文件已关闭?

List<String> rows = Files.lines(inputFilePath).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

java file-io java-8 try-with-resources java-stream

16
推荐指数
2
解决办法
2741
查看次数

找出Java 8中两个集合之间的区别?

我试图将List所有书中的所有书Collection都放在另一本书中.我的问题是我需要根据书籍ID进行比较,所以我不能只测试第一个书中是否包含第一本书,我必须确定第二个集合中的任何书籍是否与第一本书.

我有以下代码来比较两个书籍集合并过滤第一个集合:

List<Book> parentBooks = listOfBooks1.stream().filter(book->
  !listOfBooks2.contains(book)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

代码无法正常工作,因为我正在比较对象本身.我需要比较基于bookId的对象而不是整个书对象.我应该如何更改代码,以便它可以根据bookId(book.getId())进行比较?

java-8 java-stream

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

在Java 8中转换lambdas

Java 8似乎生成了表示lambda表达式的类.例如,代码:

  Runnable r = app::doStuff;
Run Code Online (Sandbox Code Playgroud)

大致表现为:

  // $FF: synthetic class
  final class App$$Lambda$1 implements Runnable {
    private final App arg$1;

    private App$$Lambda$1(App var1) {
        this.arg$1 = var1;
    }

    private static Runnable get$Lambda(App var0) {
        return new App$$Lambda$1(var0);
    }

    public void run() {
        this.arg$1.doStuff();
    }
  }
Run Code Online (Sandbox Code Playgroud)

据我了解,代码是在运行时生成的.现在,假设有人想将代码注入run上述类的方法中.迄今为止的实验产生了NoClassDefFoundVerifyError:

java.lang.NoClassDefFoundError: App$$Lambda$2
    at App$$Lambda$2/1329552164.run(Unknown Source)
    at App.main(App.java:9)
Caused by: java.lang.ClassNotFoundException: App$$Lambda$2
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more
Run Code Online (Sandbox Code Playgroud)

这是针对:

$ java -version
java …
Run Code Online (Sandbox Code Playgroud)

java instrumentation bytecode java-8

15
推荐指数
2
解决办法
2536
查看次数

小写所有HashMap键

我遇到了一个场景,我想要小写HashMap的所有键(不要问为什么,我只需要这样做).HashMap有数百万条目.

起初,我以为我只是创建一个新的Map,迭代要小写的地图条目,并添加相应的值.这个任务应该每天只运行一次或类似的东西,所以我想我可以裸露这个.

Map<String, Long> lowerCaseMap = new HashMap<>(myMap.size());
for (Map.Entry<String, Long> entry : myMap.entrySet()) {
   lowerCaseMap.put(entry.getKey().toLowerCase(), entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)

但是,当我的服务器在这一次过载时,我正要复制Map时,会导致一些OutOfMemory错误.

现在我的问题是,如何以最小的内存占用来完成这项任务?

在小写后删除每个键 - 添加到新Map帮助?

我可以利用java8流来加快速度吗?(例如这样的事情)

Map<String, Long> lowerCaseMap = myMap.entrySet().parallelStream().collect(Collectors.toMap(entry -> entry.getKey().toLowerCase(), Map.Entry::getValue));
Run Code Online (Sandbox Code Playgroud)

更新 似乎它是一个Collections.unmodifiableMap所以我没有选择

在小写之后移除每个键 - 添加到新地图

java hashmap java-8 java-stream

15
推荐指数
1
解决办法
8942
查看次数

使用Java 8流收集到Guava的ListMultiMap中

我试图使用java 8收集到ListMultiMap而不使用forEach操作.

如果我在Java 7中编写代码,它将是这样的:

ListMultimap<String, String> result = ArrayListMultimap.create();
     for(State state: states) {
      for(City city: state.getCities()) {
        result.put(state.getName(), city.getName());
      }
    }
Run Code Online (Sandbox Code Playgroud)

我在网上找到了一个网站,讨论如何创建自己的收藏家,以便在这样的场景中使用.我将此实现用于收集器.然后我写了下面的代码:

     ListMultimap<String, String> result = states
        .stream()
        .flatMap(state -> state.getCities().stream()
            .map(city -> {
              return new Pair(state, city);
            }))
        .map(pair -> {
          return new Pair(pair.first().getName(), pair.second().getName()));
        })
        .collect(MultiMapCollectors.listMultimap(
                    Pair::first,
                    Pair::second
                )
        );
Run Code Online (Sandbox Code Playgroud)

但在收集级别,我只能传递一个参数,我似乎找到了传递两个参数的方法.按照网站上的例子,我明白要使用两者,我需要在多图中存储一对"对",如下所示:

ArrayListMultimap<String, Pair> testMap = testObjectList.stream().collect(MultiMapCollectors.listMultimap((Pair p) -> p.first().getName()));
Run Code Online (Sandbox Code Playgroud)

然而,这不是我想要的,我想使用状态的名称和使用java 8的收集器(并且没有forEach)的城市名称收集到ListMultimap中.

有人可以帮助我吗?谢谢!

java guava java-8 java-stream collectors

15
推荐指数
1
解决办法
6382
查看次数

Java 9取代了Class.newInstance

在Java 9中不推荐使用Class.newInstance:

clazz.newInstance()
Run Code Online (Sandbox Code Playgroud)

可以替换为

clazz.getDeclaredConstructor().newInstance()
Run Code Online (Sandbox Code Playgroud)

问题是getDeclaredConstructor返回任何构造函数而不考虑访问级别.

如果我想替换我的代码中的所有实例(在不同的包/访问级别),我应该使用getConstructor来获取公共构造函数吗?

与指定的parameterTypes匹配的公共构造函数的Constructor对象

或者我不能批量替换所有事件,因为它需要是每个案例(如果存在公共构造函数和/或我是否具有该类的正确访问级别)?

编辑

getDeclaredConstructor:

   return getConstructor0(parameterTypes, Member.DECLARED);
Run Code Online (Sandbox Code Playgroud)

getConstructor:

   return getConstructor0(parameterTypes, Member.PUBLIC);
Run Code Online (Sandbox Code Playgroud)

java reflection constructor java-9

14
推荐指数
1
解决办法
3108
查看次数

Android是否支持Java 11?

我是android开发的新手。而且我已经在计算机上安装了eclipse,java 11和android sdk工具。但是,当我尝试构建项目时,它说要升级工具。但是我已经安装了最新的SDK。

当我在网上正在读我发现,Android不完全支持Java SE和它主要针对Java SE 6和7支持- 但是这是一个老帖子

我发现android不完全支持java 11。

我的问题是,什么是完全支持android的JDK版本,我是否必须在计算机中安装2个JDK版本?

java sdk android java-11

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