将流转换为滑动窗口的推荐方法是什么?
例如,在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) 我有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给人Stream的Map.Entry<B, C>collect(Collectors.groupingBy(...))获取应用于Map.Entry<B, C>和返回的函数B,从而收集C到的值List<C>.但它没有编译,字面意思:
无法从静态上下文引用非静态方法
在Map.Entry::getKey最后一行.
有人可以解释什么是错的或什么是实现我想要的正确方法?
我目前安装了Java 7 JDK.这已经有一段时间了.但是,最近,我的教授指示该类卸载Java JDK 7并安装Java JDK 8,以便能够处理家庭作业等.
我一直在使用Java JDK 7编写和部署Android应用程序而没有任何问题所以我想知道现在升级JDK 8是否安全?我假设我的Android开发中不需要任何Java 8特定的方法或功能.因此,如果我远离那个,我的Android开发是否会受到影响?
另外,我还没有找到任何官方文档来说明Java JDK 8是否安全或如何使其安全.无论哪种方式,我将很快升级到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 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)
当水库的结果集我是从数据库中获取,不知道什么是错的任何想法?
如何将转换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 8中有一整套日期类:
java.time.LocalDateTime;java.time.ZonedDateTime;java.time.Instant;java.time.OffsetDateTime;java.sql.Timestamp;java.util.Date.我已经传递了他们的JavaDocs并注意到所有这些类都包含我需要的所有方法.因此,目前,我可以随机选择它们.但我想有一些理由说明为什么有6个单独的类,每个类都专门用于特定目的.
技术信息和要求:
String,转换为这些日期格式之一.我的问题:
声纳告诉我"用方法参考替换这个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 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对于带有通配符的泛型有不同的行为?因为那里有问题的片段目前编译没有问题,而这里的片段没有.
通常需要为以下查询转换结果:
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方法签名等中)来说,这有点难以理解. …