Tag: java 8

如何使用流API在Java 8中映射?

好的,所以我有一个List 。 每个Person都有一个List ,它是该人拥有的电话号码列表。 所以这是基本结构: public class Person { private String name; private List phoneNumbers; // constructors and accessor methods } 我想创建一个Map ,其中key是该人拥有的每个电话号码,值是实际的人。 所以要更好地解释。 如果我有这个List : Person bob = new Person(“Bob”); bob.getPhoneNumbers().add(“555-1738”); bob.getPhoneNumbers().add(“555-1218”); Person john = new Person(“John”); john.getPhoneNumbers().add(“518-3718”); john.getPhoneNumbers().add(“518-3115”); john.getPhoneNumbers().add(“519-1987”); List list = new ArrayList(); list.add(bob); list.add(john); 我调用了这个方法。 它会给我以下Map Map map = new HashMap(); […]

为什么Java 8 Stream forEach方法的行为有所不同?

根据我对java 8 lambda表达式的理解,如果我们在花括号中不包含“ – >”之后的代码,那么将隐式返回值。 但是在下面的示例中, forEach方法期望Consumer和expression返回值,但编译器在Eclipse中没有给出错误。 List messages = Arrays.asList(new StringBuilder(), new StringBuilder()); messages.stream().forEach(s-> s.append(“helloworld”));//works fine messages.stream().forEach((StringBuilder s)-> s.append(“helloworld”)); //works fine messages.stream().forEach(s-> s); // doesn’t work , Void methods cannot return a value messages.stream().forEach(s-> s.toString()); // works fine messages.stream().forEach(s-> {return s.append(“helloworld”);}); // doesn’t work , Void methods cannot return a value messages.stream().forEach((StringBuilder s)-> {return […]

如何配置Google AppEngine以使用矢量图形?

在使用Java8的AppEngine标准环境中尝试使用SVG时出现下一个错误。 当我尝试使用POI(如slide.draw(graphics2D)在XSLFSlide上绘制SVG或使用Batik将SVG转换为PNG时,我收到此错误。 似乎出现问题是因为fontconfig无法找到字体。 在debian发行版中,它通过安装libfontconfig1来解决。 如何在AppEngine上解决它? java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) at sun.awt.FontConfiguration.init(FontConfiguration.java:107) at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774) at sun.font.SunFontManager$2.run(SunFontManager.java:431) at java.security.AccessController.doPrivileged(Native Method) at sun.font.SunFontManager.(SunFontManager.java:376) at sun.awt.FcFontManager.(FcFontManager.java:35) at sun.awt.X11FontManager.(X11FontManager.java:57) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:443) at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83) at java.security.AccessController.doPrivileged(Native Method) at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) at java.awt.Font.getFont2D(Font.java:491) at java.awt.Font.canDisplay(Font.java:1980) at org.apache.poi.sl.draw.DrawTextParagraph.canDisplayUpTo(DrawTextParagraph.java:756) at org.apache.poi.sl.draw.DrawTextParagraph.getAttributedString(DrawTextParagraph.java:640) at org.apache.poi.sl.draw.DrawTextParagraph.breakText(DrawTextParagraph.java:248) at org.apache.poi.sl.draw.DrawTextShape.drawParagraphs(DrawTextShape.java:159) […]

DateTimeFormatter模式有问题

我正在编写一个股票程序(到目前为止)通过以下请求从“Markit on Demand”获取数据: http://dev.markitondemand.com/Api/v2/Quote/xml?symbol=aapl 这将返回xml中的数据,其中包含各种库存度量(符号,名称,最后价格,更改,时间戳等)。 我在Java 8中创建DateTimeFormatter以制作时间戳时遇到问题。 时间戳的一个示例: Fri Jul 18 15:59:00 UTC-04:00 2014 到目前为止,我的模式如下: EEE MMM d HH:mm:ss OOOO yyyy 我相信你们中的一些人可以发现,我在抵消方面遇到了麻烦。 来自文档: 偏移X和x:根据模式字母的数量格式化偏移。 一个字母仅输出小时,例如’+01’,除非分钟非零,在这种情况下分钟也输出,例如’+0130’。 两个字母输出小时和分钟,没有冒号,例如’+0130’。 三个字母输出小时和分钟,带有冒号,例如’+01:30’。 四个字母输出小时和分钟以及可选秒,没有冒号,例如’+013015’。 五个字母输出小时和分钟,可选秒输出冒号,例如’+01:30:15’。 六个或更多字母抛出IllegalArgumentException。 当要输出的偏移量为零时,模式字母“X”(大写)将输出“Z”,而模式字母“x”(小写)将输出“+00”,“+ 0000”或“+00” :00′ 。 偏移O:根据模式字母的数量格式化局部偏移。 一个字母输出局部偏移的缩写forms,即局部偏移文本,例如’GMT’,小时不带前导零,可选2位数分钟,第二个非零,和冒号,例如’GMT + 8 ”。 四个字母输出完整forms,这是本地化的偏移文本,例如’GMT,具有2位小时和分钟字段,可选的第二字段(如果非零)和冒号,例如’GMT + 08:00’。 任何其他字母数量都会抛出IllegalArgumentException。 偏移Z:根据模式字母的数量格式化偏移。 一个,两个或三个字母输出小时和分钟,没有冒号,例如’+0130’。 当偏移量为零时,输出将为“+0000”。 四个字母输出完整forms的局部偏移,相当于Offset-O的四个字母。 如果偏移为零,则输出将是相应的本地化偏移文本。 五个字母输出小时,分钟,可选第二个,如果非零,则使用冒号。 如果偏移量为零,则输出“Z”。 六个或更多字母抛出IllegalArgumentException。 // String rawDate = […]

为什么File :: isDirectory作为FileFilter工作正常?

为什么File :: isDirectory在下面的例子中作为FileFilter正常工作? File[] files = new File(“.”).listFiles(File::isDirectory); listFiles方法需要FileFilter作为参数 public File[] listFiles(FileFilter filter) { … } FileFilter是一个function接口,它有一个方法接受 File参数 boolean accept(File pathname); 而且File类中的isDirectory方法没有参数 public boolean isDirectory() { … }

使用JDK 8编译generics方法时损坏

我有一些带有类Box遗留代码,可以将Serializable数据放入Map ,当使用Oracle JDK 1.7 Update 80编译时,它可以在Oracle JRE 1.8 Update 102上正常运行。 但是当我使用Oracle JDK 1.8 Updater 102编译它时,它无法正常运行。 我遇到了genericsget函数的一些问题。 SSCCE使用有问题的通用get函数从Box实例输出格式化日期: import java.io.Serializable; import java.util.Date; import java.util.HashMap; public class Box implements Serializable{ private HashMap values = new HashMap(); public T get(String key){ return (T) this.values.get(key); } public void put(String key, Serializable value){ this.values.put(key, value); } public static void main(String[] […]

为什么在Java 8中将@FunctionalInterface注释添加到Comparator接口?

我理解使用Java 8的default关键字添加了一堆带body的方法。我的问题是这个注释在哪里有用? 我看到只允许使用这样的注释添加一个抽象方法。 但比较器有两种抽象方法: int compare(T o1, T o2); boolean equals(Object obj); 另外,请解释一下这个注释的用法? 我看到它是一个运行时注释,那么它的用途是什么?

Java Lambda:迭代2个dim-array保持当前索引

我是Java 8的Lambda表达式的新手,我想制定以下内容:我有一个二维数组,我想在我的应用程序代码中迭代几次,并对数组中的项进行处理。 在我做以下之前: public static abstract class BlaBlaIterator { private final BlaBla[][] blabla; public BlaBlaIterator(final BlaBla[][] blabla) { this.blabla = blabla; } public void iterate() { final int size = blabla.length; for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { final BlaBla bla = […]

连接List中所有Maps的String值

我正在尝试调整Lambdafunction,但是在这里和那里很少有挣扎。 List<Map> list = new LinkedList(); Map map = new HashMap(); map.put(“data1”, “12345”); map.put(“data2”, “45678”); list.add(map); 我只想以逗号分隔格式打印值,如12345,45678 所以这是我的审判 list.stream().map(Map::values).collect(Collectors.toList()) //Collectors.joining(“,”) 输出为[[12345,45678]] 。 这意味着,有一个列表和内部列表,它在0索引处创建逗号分隔值。 我明白为什么会这样做。 但是我没有通过如何提取我想要的结果,除非我在该表达式的末尾调用.get(0) 。 任何有关如何更好地使用lambdas的帮助/更多见解将会有所帮助

在ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent中执行`mappingFunction`

我正在尝试查看实际的Java文档,该文档描述了在传递给ConcurrentHashMap.computeIfAbsent和ConcurrentHashMap.computeIfPresent方法时可以调用mappingFunction次数。 ConcurrentHashMap.computeIfAbsent的Javadoc似乎很清楚,表示mappingFunction最多只执行一次: ConcurrentHashMap.computeIfAbsent Javadoc 如果指定的键尚未与值关联,则尝试使用给定的映射函数计算其值,并将其输入此映射,除非为null。 整个方法调用是以primefaces方式执行的, 因此每个键最多应用一次该函数 。 其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射。 但是ConcurrentHashMap.computeIfPresent的Javadoc没有说明可以执行mappingFunction次数: ConcurrentHashMap.computeIfPresent Javadoc 如果存在指定键的值,则尝试在给定键及其当前映射值的情况下计算新映射。 整个方法调用以primefaces方式执行。 其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射。 通过查看源代码,他们看起来就像mappingFunction最多只执行一次。 但我真的希望看到保证这种行为的实际文档。 有这样的文件吗?