标签: java-8

如何将Java流转换为滑动窗口?

将流转换为滑动窗口的推荐方法是什么?

例如,在Ruby中你可以使用each_cons:

irb(main):020:0> [1,2,3,4].each_cons(2) { |x| puts x.inspect }
[1, 2]
[2, 3]
[3, 4]
=> nil
irb(main):021:0> [1,2,3,4].each_cons(3) { |x| puts x.inspect }
[1, 2, 3]
[2, 3, 4]
=> nil
Run Code Online (Sandbox Code Playgroud)

在Guava中,我发现只有Iterators#partition,它是相关的但没有滑动窗口:

final Iterator<List<Integer>> partition =
   Iterators.partition(IntStream.range(1, 5).iterator(), 3);
partition.forEachRemaining(System.out::println);
-->
[1, 2, 3]
[4]
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

14
推荐指数
4
解决办法
7406
查看次数

Java Streams:获取按内部映射键分组的值

我有Map<A, Map<B, C>>,我想Map<B, List<C>>使用Java Streams 从中获取.

我尝试按如下方式进行:

public <A, B, C> Map<B, List<C>> groupsByInnerKey(Map<A, Map<B, C>> input) {
    return input.values()
            .stream()
            .flatMap(it -> it.entrySet().stream())
            .collect(Collectors.groupingBy(Map.Entry::getKey));
}
Run Code Online (Sandbox Code Playgroud)

我期待的是:

  • flatMap给人StreamMap.Entry<B, C>
  • collect(Collectors.groupingBy(...))获取应用于Map.Entry<B, C>和返回的函数B,从而收集C到的值List<C>.

但它没有编译,字面意思:

无法从静态上下文引用非静态方法

Map.Entry::getKey最后一行.

有人可以解释什么是错的或什么是实现我想要的正确方法?

java grouping java-8 java-stream collectors

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

我现在可以"使用"Java 8与Android开发吗?

我目前安装了Java 7 JDK.这已经有一段时间了.但是,最近,我的教授指示该类卸载Java JDK 7并安装Java JDK 8,以便能够处理家庭作业等.

我一直在使用Java JDK 7编写和部署Android应用程序而没有任何问题所以我想知道现在升级JDK 8是否安全?我假设我的Android开发中不需要任何Java 8特定的方法或功能.因此,如果我远离那个,我的Android开发是否会受到影响?

另外,我还没有找到任何官方文档来说明Java JDK 8是否安全或如何使其安全.无论哪种方式,我将很快升级到Java 8 ...

java android java-8

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

使用java 8在文件中查找模式

考虑我有一个文件(只是一个摘录)

name: 'foobar'
Run Code Online (Sandbox Code Playgroud)

foobar当我发现这条线时,我喜欢检索name.

我目前的做法是

Pattern m = Pattern.compile("name: '(.+)'");
try (Stream<String> lines = Files.lines(ruleFile)) {
    Optional<String> message = lines.filter(m.asPredicate()).findFirst();
    if (message.isPresent()) {
        Matcher matcher = m.matcher(message.get());
        matcher.find();
        String group = matcher.group(1);
        System.out.println(group);
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来不太好看.过度使用模式和匹配器似乎是错误的.

有更简单/更好的方法吗?特别是如果我有多个键我喜欢这样搜索?

java regex java-8

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

java 8 collectors的问题类型不匹配:无法从List <Object>转换为List <String>

我正在使用早期版本的java 8工作代码,我用它从列表中获取唯一值但是因为我升级到JDK 66它给了我一个错误

类型不匹配:无法转换List<Object>List<String>

List<String> instList = new ArrayList<String>();

while (res.next()) {
    instList.add(res.getString("INST").toString());
}           

List<String> instListF = instList.stream().distinct().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

水库的结果集我是从数据库中获取,不知道什么是错的任何想法?

java java-8 collectors

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

如何在Java 8中将Map转换为List

如何将转换Map<String, Double>List<Pair<String, Double>>使用Java 8?

我写了这个实现,但效率不高

Map<String, Double> implicitDataSum = new ConcurrentHashMap<>();
//....
List<Pair<String, Double>> mostRelevantTitles = new ArrayList<>();
implicitDataSum.entrySet().stream().
                .sorted(Comparator.comparing(e -> -e.getValue()))
                .forEachOrdered(e -> mostRelevantTitles.add(new Pair<>(e.getKey(), e.getValue())));

return mostRelevantTitles;
Run Code Online (Sandbox Code Playgroud)

我知道它应该可以使用.collect(Collectors.someMethod()).但我不明白该怎么做.

java java-8 java-stream

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

我应该在Java 8中使用哪个日期类?

Java 8中有一整套日期类:

我已经传递了他们的JavaDocs并注意到所有这些类都包含我需要的所有方法.因此,目前,我可以随机选择它们.但我想有一些理由说明为什么有6个单独的类,每个类都专门用于特定目的.

技术信息和要求:

  1. 输入为in String,转换为这些日期格式之一.
  2. 我不需要显示时区,但是当我比较两个日期时,能够正确比较纽约和巴黎的时间非常重要.
  3. 精确级别是秒,不需要使用毫秒.
  4. 所需的操作:
    • 找到最大/最小日期;
    • 按日期排序对象;
    • 计算日期和时间段(两个日期之间的差异);
    • 将对象插入MongoDB并按日期从数据库中检索它们(例如,特定日期之后的所有对象).

我的问题:

  1. 我应该记住哪些方面,以便从性能和可维护性的角度选择这四个选项中的最佳格式?
  2. 有什么理由我应该避免这些日期类别吗?

java datetime timestamp date java-8

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

SONAR:用方法引用替换此lambda

声纳告诉我"用方法参考替换这个lambda"

public class MyClass {

    private List<SomeValue> createSomeValues(List<Anything> anyList) {
        return anyList //
               .stream() //
               .map(anything -> createSomeValue(anything)) //
               .collect(Collectors.toList());
   }

    private SomeValue createSomeValue(Anything anything) {
        StatusId statusId = statusId.fromId(anything.getStatus().getStatusId());
        return new SomeValue(anything.getExternId(), statusId);
    }

}
Run Code Online (Sandbox Code Playgroud)

这可能吗?我尝试了几件事,比如

.map(MyClass::createSomeValue) //
Run Code Online (Sandbox Code Playgroud)

但我需要将方法更改为静态.而且我不是静态方法的忠实粉丝.

SonarQube的解释是:

方法/构造函数引用比使用lambdas更紧凑和可读,因此是首选.

java lambda java-8 sonarqube method-reference

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

Java Stream Generics Type Mismatch

在操作Java 8流时,我遇到了一个错误,编译器似乎"忘记"了我的泛型参数的类型.

以下代码段创建了一个类名流,并尝试将流映射到流的流Class<? extends CharSequence>.

public static Stream<Class<? extends CharSequence>> getClasses() {

    return Arrays.asList("java.lang.String", "java.lang.StringBuilder", "Kaboom!")
        .stream()
        .map(x -> {
            try {
                Class<?> result = Class.forName(x);

                return result == null ? null : result.asSubclass(CharSequence.class);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        })
        //.filter(x -> x != null)
        ;

}
Run Code Online (Sandbox Code Playgroud)

当我取消注释过滤器以从流中删除空条目时,我得到编译错误

类型不匹配:无法转换为Class <capture#15-of?将CharSequence>扩展为Class <Object>

有人可以向我解释为什么添加过滤器导致此错误?

PS:这里的代码有些随意,很容易让错误消失:在应用过滤器之前将映射流分配给临时变量.我感兴趣的是为什么上面的代码片段会产生编译时错误.

编辑:正如@Holger所指出的那样,这个问题并不完全与Java 8 Streams重复:为什么Collectors.toMap对于带有通配符的泛型有不同的行为?因为那里有问题的片段目前编译没有问题,而这里的片段没有.

java eclipse java-8 java-stream

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

列出<Object []>到java 8中的Map <K,V>

通常需要为以下查询转换结果:

select category, count(*)
from table
group by category
Run Code Online (Sandbox Code Playgroud)

到一个映射,其中键是类别,值是属于同一类别的记录的数量.

许多持久性框架返回此类查询的结果List<Object[]>,其中对象数组包含两个元素(类别和每个返回结果集行的计数).

我试图找到最可读的方式将此列表转换为相应的地图.

当然,传统方法包括创建地图并手动输入条目:

Map<String, Integer> map = new HashMap<>();
list.stream().forEach(e -> map.put((String) e[0], (Integer) e[1]));
Run Code Online (Sandbox Code Playgroud)

我想到的第一个单线程是利用开箱即用的Collectors.toMap收集器:

Map<String, Integer> map = list.stream().collect(toMap(e -> (String) e[0], e -> (Integer) e[1]));
Run Code Online (Sandbox Code Playgroud)

但是,我发现这种e -> (T) e[i]语法比传统方法的可读性差一点.为了解决这个问题,我可以创建一个util方法,我可以在所有这些情况下重用它:

public static <K, V> Collector<Object[], ?, Map<K, V>> toMap() {
  return Collectors.toMap(e -> (K) e[0], e -> (V) e[1]);
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个完美的单行:

Map<String, Integer> map = list.stream().collect(Utils.toMap());
Run Code Online (Sandbox Code Playgroud)

由于类型推断,甚至不需要转换键和值.但是,对于代码的其他读者(Collector<Object[], ?, Map<K, V>>在util方法签名等中)来说,这有点难以理解. …

java lambda java-8 java-stream collectors

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