小编Hol*_*ger的帖子

包不可见错误

我试图在我的项目中使用joptsimple包但我得到以下错误:

Error:(4, 20) java: package jdk.internal.joptsimple is not visible
  (package jdk.internal.joptsimple is declared in module jdk.internal.opt, which does not export it to the unnamed module)
Run Code Online (Sandbox Code Playgroud)

任何想法我应该怎么做呢?

java java-9

8
推荐指数
2
解决办法
5321
查看次数

Java 8访问lambda的私有成员?

使用java.lang.invoke.MethodHandle调用私有方法给出了私有成员访问的答案,而使用LambdaMetafactory的Java访问bean方法给出了基于lambda的成员访问的答案.但是,通过组合这两者,我仍然找不到通过lambda访问私有成员的方法.错误:

Caused by: java.lang.IllegalAccessException: member is private: XXX from ZZZ
at java.lang.invoke.MethodHandles$Lookup.revealDirect(MethodHandles.java:1353)
at java.lang.invoke.AbstractValidatingLambdaMetafactory.<init>(AbstractValidatingLambdaMetafactory.java:131)
at java.lang.invoke.InnerClassLambdaMetafactory.<init>(InnerClassLambdaMetafactory.java:155)
at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:299)
Run Code Online (Sandbox Code Playgroud)

指向revealDirect,它是metafactory调用站点构建器的一部分.如何自定义构建器以控制其访问检查?

更新:每个Holger 工作解决方案选项#3的示例

java lambda java-8

7
推荐指数
1
解决办法
1674
查看次数

无法理解此Java Stream + Generics示例

有人可以帮助我理解为什么这段代码的行为如评论中所述

// 1) compiles
List<Integer> l = Stream.of(1, 2, 3).collect(ArrayList::new, ArrayList::add, ArrayList<Integer>::addAll);

/*
 *  2) does not compile
 *  
 *  Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
 *      Type mismatch: cannot convert from Object to <unknown>
 *      The type ArrayList does not define add(Object, Integer) that is applicable here
 *      The type ArrayList does not define addAll(Object, Object) that is applicable here
 */
Stream.of(1, 2, 3).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

// 3) compiles
Stream.of(1, 2, 3).collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);

/*
 *  4) …
Run Code Online (Sandbox Code Playgroud)

java eclipse generics java-8 java-stream

7
推荐指数
1
解决办法
2354
查看次数

在ParallelStream中使用java isomicReference线程是否安全?

我使用parallelStream来获取数组中最长的字符串,代码跟随,每次运行时,我得到不同的结果.AtomicReference假设即使在parallelStream中使用时也是线程安全的?但为什么会这样呢?

public static void main(String[] args) {
  AtomicReference<String> longest = new AtomicReference<>();
  LongAccumulator accumulator = new LongAccumulator(Math::max, 0);
  List<String> words = Arrays.asList("him", "he", "thanks", "strings", "congratulations", "platform");
  words.parallelStream().forEach(
          next -> longest.updateAndGet(
                     current -> {
                        String result = next.length() > accumulator.intValue() ? next : current;
                        accumulator.accumulate(next.length());
                        return result;
                     }
                  )
  );
  System.out.println(longest.get());
}
Run Code Online (Sandbox Code Playgroud)

有一段时间,我打印出"祝贺",有时我打印出"平台".

java java-8

7
推荐指数
1
解决办法
478
查看次数

拆分字符串并将其存储到HashMap java 8中

我想分割下面的字符串并将其存储到HashMap中.

String responseString = "name~peter-add~mumbai-md~v-refNo~"; 
Run Code Online (Sandbox Code Playgroud)

首先,我使用分隔符连字符( - )拆分字符串并将其存储到ArrayList中,如下所示:

 public static List<String> getTokenizeString(String delimitedString, char separator) {
    final Splitter splitter = Splitter.on(separator).trimResults();
    final Iterable<String> tokens = splitter.split(delimitedString);
    final List<String> tokenList = new ArrayList<String>();
    for(String token: tokens){
        tokenList.add(token);
    }
    return tokenList;
}
List<String> list = MyClass.getTokenizeString(responseString, "-");
Run Code Online (Sandbox Code Playgroud)

然后使用下面的代码将其转换为使用流的HashMap.

HashMap<String, String> = list.stream()
                          .collect(Collectors.toMap(k ->k.split("~")[0], v -> v.split("~")[1]));
Run Code Online (Sandbox Code Playgroud)

流收集器不起作用,因为没有refNo的值.

如果我在ArrayList中有偶数个元素,它可以正常工作.

有办法处理这个吗?还建议我如何使用流来执行这两个任务(我不想使用getTokenizeString()方法)使用流java 8.

java arraylist hashmap java-8 java-stream

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

Java 8 - 带列表的平面地图

我有一个像Map这样的结构<String,List<Map<String,Object>>.我想将一个函数应用于地图,如下所示.该方法接受一个键并使用<String,Object>列表的Map .每个键<String,Object>在列表中都有几个Map .如何将处理方法应用于Map的每个值的地图键<String,Object>?我能够使用forEach循环(见下文),但我感觉这不是以功能方式解决问题的最佳方法.

TypeProcessor p=new TypeProcessor.instance();

//Apply this function to the key and each map from the list
// The collect the Result returned in a list.
Result process(String key, Map<String,Object> dataPoints);
Run Code Online (Sandbox Code Playgroud)
List<Result> list = new ArrayList<>();
map.forEach(key,value) -> {
  value.forEach(innerVal -> {
    Result r=p.process(key,innerVal);
    list.add(r):
  });
});
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

7
推荐指数
1
解决办法
2164
查看次数

如何对服装尺寸列表进行排序(例如4XL,S,2XL)?

我需要你的帮助按照查询.鉴于以下列表:

["2XL", "3XL", "4XL", "5XL", "6XL", "L", "M", "S", "XL"]
Run Code Online (Sandbox Code Playgroud)

如何对其进行排序以使其按此顺序排列?

["S","M","L","XL","2XL","3XL","4XL","5XL","6XL"]

请注意,并不总是存在每个尺寸.

java java-8

7
推荐指数
2
解决办法
813
查看次数

Stream.reduce(Float,BinaryOperator)BinaryOperator是指哪种功能接口方法?

例如,

List<Product> productsList = new ArrayList<Product>();  
productsList.add(new Product(1,"HP Laptop",25000f));  
productsList.add(new Product(2,"Dell Laptop",30000f));  
productsList.add(new Product(3,"Lenevo Laptop",28000f));  
productsList.add(new Product(4,"Sony Laptop",28000f));  
productsList.add(new Product(5,"Apple Laptop",90000f));  

Float totalPrice = productsList.stream()  
                               .map(product->product.price)  
                               .reduce(0.0f,(sum, price)->sum+price);   
System.out.println(totalPrice); 
Run Code Online (Sandbox Code Playgroud)

这是哪个功能界面,(sum, price)->sum+price是指?

java java-8 java-stream functional-interface

7
推荐指数
2
解决办法
92
查看次数

用于 Streams 的包含 takeWhile()

我想知道是否有办法添加针对方法 takeWhile() 的条件测试的流的最后一个元素。我相信我想实现类似于 RxJava 的 takeUntil() 方法的东西。

我猜没有直接的方法可以做到这一点(如果我错了,请纠正我),但我想知道是否有适当的解决方法来实现这一点,我现在知道了。

我在 Stackoverflow 中进行了搜索,但几乎没有成功。如果您认为有可以解决我的问题的线程,我当然希望看到它。

如果您查看以下代码的 peek(),您将看到数字 5 已根据 takeWhile() 条件进行检查,但它从未到达 forEach() 中:

IntStream.of(1, 3, 2, 5, 4, 6)
        .peek(foo -> System.out.println("Peek: " + foo))
        .takeWhile(n -> n < 5)
        .forEach(bar -> System.out.println("forEach: " + bar));
Run Code Online (Sandbox Code Playgroud)

预期结果是根据 takeWhile 的条件检查的最后一个元素到达 forEach 的 System.out::println。在这种情况下,它是 5。

谢谢大家!

java java-stream java-9

7
推荐指数
2
解决办法
866
查看次数

如何从 ArrayList 中添加和删除重复的对象?

用户详细信息模型:

private String userName;
private int userSalary;
Run Code Online (Sandbox Code Playgroud)

我有一个用户信息的 ArrayList

List<UserDetail> userDetails = new ArrayList<>();

UserDetail user1 = new UserDetail("Robert", 100);
UserDetail user2 = new UserDetail("John", 100);
UserDetail user3 = new UserDetail("Robert", 55);

userdetails.add(user1);
userdetails.add(user2);
userdetails.add(user3);
Run Code Online (Sandbox Code Playgroud)

我正在尝试遍历数组并找出是否有任何重复的条目基于userName,从上面的列表中我有两条用户名相同的记录"Robert",在这种情况下,我想添加userSalary并从列表。

预期的新 ArrayList:

userName userSalary

Robert 155
John 100
Run Code Online (Sandbox Code Playgroud)

这可能吗 ??

java java-8

7
推荐指数
1
解决办法
161
查看次数