Tag: java 8

为什么String.chars()是Java 8中的整数串?

在Java 8中,有一个新的方法String.chars() ,它返回一个代表字符代码的int ( IntStream )stream。 我想很多人会期望这里有一串char 。 这样deviseAPI的动机是什么?

如何定义一个在Java 8中将lambda作为参数的方法?

在Java 8中,方法可以创build为Lambdaexpression式,并且可以通过引用传递(在引擎下进行一些工作)。 在线创build和使用lambdaexpression式的例子很多,但没有例子说明如何创build一个以lambda为参数的方法。 这是什么语法? MyClass.method((a, b) -> a+b); class MyClass{ //How do I define this method? static int method(Lambda l){ return l(5, 10); } }

为什么Stream <T>不能实现Iterable <T>?

在Java 8中,我们有Stream <T>类,它好奇地有一个方法 Iterator<T> iterator() 所以你会希望它实现接口Iterable <T> ,它需要这个方法,但事实并非如此。 当我想使用foreach循环遍历Stream时,我必须做类似的事情 public static Iterable<T> getIterable(Stream<T> s) { return new Iterable<T> { @Override public Iterator<T> iterator() { return s.iterator(); } }; } for (T element : getIterable(s)) { … } 我在这里错过了什么?

LambdaConversionException与generics:JVM的错误?

我有一些代码的方法引用编译罚款,并在运行时失败。 例外情况如此: Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class redacted.BasicEntity; not a subtype of implementation type interface redacted.HasImagesEntity at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:233) at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:303) at java.lang.invoke.CallSite.makeSite(CallSite.java:289) 这个class是这样的: class ImageController<E extends BasicEntity & HasImagesEntity> { void doTheThing(E entity) { Set<String> filenames = entity.getImages().keySet().stream() .map(entity::filename) .collect(Collectors.toSet()); } } 引发exception是为了parsingentity :: filename。 filename()在HasImagesEntity上声明。 据我所知,我得到了这个exception,因为E的擦除是BasicEntity,而JVM不能(不能)考虑E上的其他边界。 当我重写方法引用作为一个微不足道的lambda,一切都很好。 对我来说,一个结构按预期工作,其语义相当于爆炸似乎真的很可疑。 这可能是在规范? 我试图很难find一种方法,这不是在编译器或运行时的问题,并没有提出任何事情。

genericstypes推断不适用于方法链接?

这在Java 7中无法编译: class Map<K,V> { static <K,V> Map<K,V> empty() {return null;} Map<K,V> put(K k, V v) {return null;} V get(K k) {return null;} } class A { static void f(Map<Integer,String> m){} public static void main(String[] args) { f(Map.empty()); } } 它不会推断从Map.empty()返回的Map的具体types: $ javac7 A.java A.java:10: error: method f in class A cannot be applied to […]

_(下划线)是一个保留关键字

我刚刚用下面的lambdaexpression式replace了s : s -> Integer.parseInt(s) Eclipse编译器说: '_'不应该被用作一个标识符,因为它是来自源级别1.8的保留关键字。 我还没有在JLS§3.9词法结构/关键词中find任何解释。

并行stream,收集器和线程安全

请参阅下面的简单示例,其中列出了每个单词的出现次数: Stream<String> words = Stream.of("a", "b", "a", "c"); Map<String, Integer> wordsCount = words.collect(toMap(s -> s, s -> 1, (i, j) -> i + j)); 最后, wordsCount是{a=2, b=1, c=1} 。 但是我的stream量非常大,我想平行工作,所以我写道: Map<String, Integer> wordsCount = words.parallel() .collect(toMap(s -> s, s -> 1, (i, j) -> i + j)); 不过,我注意到wordsCount是一个简单的HashMap所以我不知道是否需要明确要求一个并发映射来确保线程安全: Map<String, Integer> wordsCount = words.parallel() .collect(toConcurrentMap(s -> […]

Java 8stream的.min()和.max():为什么编译?

注:这个问题来自一个死链接,这是一个以前的SO问题,但在这里… 看到这个代码( 注意:我知道这个代码不会“工作”,应该使用Integer::compare – 我只是从链接的问题中提取它 ): final ArrayList <Integer> list = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList()); System.out.println(list.stream().max(Integer::max).get()); System.out.println(list.stream().min(Integer::min).get()); 根据.min()和.max()的javadoc,两者的参数应该是Comparator 。 然而这里的方法引用是Integer类的静态方法。 那么,为什么这个编译呢?

我应该返回一个集合或stream?

假设我有一个将只读视图返回给成员列表的方法: class Team { private List<Player> players = new ArrayList<>(); // … public List<Player> getPlayers() { return Collections.unmodifiableList(players); } } 进一步假设所有客户端都立即迭代列表一次。 也许把玩家放入JList或其他东西。 客户端不存储对列表的引用以供以后检查! 鉴于这种常见的情况,我应该返回一个stream吗? public Stream<Player> getPlayers() { return players.stream(); } 或者在Java中返回一个非惯用的stream? stream被devise为始终被“终止”在他们创build的相同expression式内?

Java 8中的map和flatMap方法有什么区别?

在Java 8中, Stream.map和Stream.flatMap方法有什么区别?