Tag: java 8

为什么这个Java Stream运行两次?

Java 8 API说: 直到stream水线的terminal操作被执行,才开始stream水线源的穿越。 那么为什么下面的代码抛出: java.lang.IllegalStateException:stream已经被操作或closures Stream<Integer> stream = Stream.of(1,2,3); stream.filter( x-> x>1 ); stream.filter( x-> x>2 ).forEach(System.out::print); 根据API的第一个过滤操作不应该在Stream上操作。

为什么java.util.Collection没有实现新的Stream接口?

我花了一些时间开始研究关于stream和lambdas的java-8嗡嗡声。 让我吃惊的是,你不能直接在java.util.Collection上应用Stream操作,比如.map() .filter() 。 是否有一个技术原因,为什么java.util.Collection接口没有扩展这些stream操作的默认实现? 使用Googlesearch一下,我看到很多例子都是按照以下模式进行编码的: List<String> list = someListExpression; List<String> anotherList = list.stream().map(x -> f(x)).collect(Collectors.toList()); 如果你在你的代码中有很多这样的stream操作,就会变得非常笨拙。 由于.stream()和.collect()与你想expression的内容完全无关,所以你更愿意说: List<String> list = someListExpression; List<String> anotherList = list.map(x -> f(x));

用java 8 lambdaexpression式打印错误信息

我想使用一个静态方法作为setter助手来捕获exception,并打印有关失败操作的debugging信息。 我不想只有例外的细节。 我想显示哪些属性正在设置,以便详细帮助快速debugging问题。 我正在使用Java 8。 我应该如何提供或检测设置的财产? 我希望在示例中删除“名称”string,并得到相同的结果。 我知道我不能使用所提供的setter方法的reflection来转换为lambdaexpression式,然后转换为BiConsumer。 我得到这个,但需要提供属性名称。 /** setter helper method **/ private static <E, V> void set(E o, BiConsumer<E, V> setter, Supplier<V> valueSupplier, String propertyName) { try { setter.accept(o, valueSupplier.get()); } catch (RuntimeException e) { throw new RuntimeException("Failed to set the value of " + propertyName, e); } } 例: Person p […]

我怎样才能创build一个数组stream?

目前,无论何时我需要从数组创buildstream,我都这样做 String[] array = {"x1", "x2"}; Arrays.asList(array).stream(); 有一些直接的方法来创build数组的stream?

Lambdaexpression式和通用方法

假设我有一个通用的接口: interface MyComparable<T extends Comparable<T>> { public int compare(T obj1, T obj2); } 和一种方法sort : public static <T extends Comparable<T>> void sort(List<T> list, MyComparable<T> comp) { // sort the list } 我可以调用这个方法,并传递一个lambdaexpression式作为参数: List<String> list = Arrays.asList("a", "b", "c"); sort(list, (a, b) -> a.compareTo(b)); 这将工作正常。 但是现在如果我使接口非generics,并且generics的方法: interface MyComparable { public <T extends Comparable<T>> int compare(T obj1, […]

如何否定一个方法引用谓词

在Java 8中,您可以使用方法引用来过滤stream,例如: Stream<String> s = …; int emptyStrings = s.filter(String::isEmpty).count(); 有没有一种方法来创build一个方法的参考是否定一个现有的,即类似的东西: int nonEmptyStrings = s.filter(not(String::isEmpty)).count(); 我可以创build如下的not方法,但我想知道JDK是否提供了类似的东西。 static <T> Predicate<T> not(Predicate<T> p) { return o -> !p.test(o); }

如何在Java 8和Java 9中使用无符号的Integer?

在Oracle的“Primitive data types” 页面中 ,它提到了Java 8增加了对unsigned int和long的支持: int :默认情况下, int数据types是一个32位有符号的二进制补码整数,其最小值为-2 31 ,最大值为2 31 -1。 在Java SE 8和更高版本中,可以使用int数据types来表示一个无符号的32位整数,它的最小值为0,最大值为2 32 -1。 使用Integer类将int数据types用作无符号整数。 有关更多信息,请参见数字类部分。 像compareUnsigned , divideUnsigned等静态方法已被添加到Integer类来支持无符号整数的算术运算。 long : long数据types是一个64位的二进制补码整数。 有符号long的最小值为-2 63 ,最大值为2 63 -1。 在Java SE 8和更高版本中,可以使用long数据types来表示无符号的64位long ,其最小值为0,最大值为2 64 -1。 当你需要一个比int提供的值更宽的范围时,使用这个数据types。 Long类还包含像compareUnsigned , divideUnsigned等方法来支持无符号long算术运算。 但是,我发现无法声明一个无符号的long或integer。 例如,下面的代码给出了一个编译器的错误信息:“字面超出范围”(当然我使用的是Java 8),它应该在范围内(分配的值恰好是2 64 -1) : public class Foo { static long values […]

Lambdaexpression式将数组/string列表转换为数组/列表整数

由于Java 8带有强大的lambdaexpression式, 我想写一个函数来转换一个列表/数组的string数组/列表整数,浮动,双打等。 在普通的Java中,它将如此简单 for(String str : strList){ intList.add(Integer.valueOf(str)); } 但是,如何给lambda赋予一个string数组,将其转换为一个整数数组,如何实现同样的效果。

通过计数Java 8streamAPI进行分组

我尝试在Java 8streamAPI中find一个简单的方法来做分组,我用这种复杂的方式出来了! List<String> list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List<String>> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); List<String[]> collect2 = collect .entrySet() .stream() .map(e -> new String[] { e.getKey(), String.valueOf(e.getValue().size()) }) .collect(Collectors.toList()); collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1])); 我感谢你的意见。

接口中定义的方法的“默认”实现是什么?

在Collection接口中,我find了一个名为removeIf()的方法,它包含了它的实现。 default boolean removeIf(Predicate<? super E> filter) { Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed; } 我想知道是否有任何方法在界面中定义方法体? 什么是default关键字,它是如何工作的?