在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ Java中(key1, key2) -> key2怎么理解?

Java中(key1, key2) -> key2怎么理解?

問(wèn)題一

Collectors.toMap(PositionContent::getName, Function.identity(), (key1, key2) -> key2)
這個(gè)怎么理解?

Map<String,PositionContent> map = list.stream().collect(Collectors.toMap(PositionContent::getName, Function.identity(), (key1, key2) -> key2));

問(wèn)題二

.newBuilder()
.maximumSize(1000)
.expireAfterAccess(10, TimeUnit.MINUTES)

這種點(diǎn)點(diǎn)是什么意思?這段是什么意思?

static LoadingCache<String, Object> screenSource = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterAccess(10, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<String, Object>() {
                        public Object load(String key)  {
                            return getValue(key);
                        }

                    });

源碼

public class PurposeFileUtil {
    public static final String Positions ="positions";
    static LoadingCache<String, Object> screenSource = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterAccess(10, TimeUnit.MINUTES)
            .build(
                    new CacheLoader<String, Object>() {
                        public Object load(String key)  {
                            return getValue(key);
                        }

                    });
    private static Object getValue(String key){
        Config conf = ConfigFactory.parseFile(new File("perception-purpose.conf"));
        List<PositionContent> list = JSON.parseArray(JSON.toJSONString(conf.getAnyRefList("screen.positions")),PositionContent.class);
        Map<String,PositionContent> map = list.stream().collect(Collectors.toMap(PositionContent::getName, Function.identity(), (key1, key2) -> key2));
        switch(key){
            case Positions:
                return map;
            default :
                return conf.getAnyRefList("screen.responce.time.line");
        }
    }
    public static Object getSourceByKey(String key)throws Exception{
        return screenSource.get(key);
    }
    public static void initSource(){
        try {
            JNotify.addWatch("conf", JNotify.FILE_MODIFIED, false, new JNotifyListener(){
                @Override
                public void fileRenamed(int wd, String rootPath, String oldName, String newName) {
                }
                @Override
                public void fileModified(int wd, String rootPath, String name) {
                    if(name.equals("source.conf")){
                        loadSource(rootPath,name);
                    }
                }

                public void fileDeleted(int wd, String rootPath, String name) {
                }

                public void fileCreated(int wd, String rootPath, String name) {
                }
            });
        } catch (JNotifyException e) {
            log.error("error watch file");
        }
        while (true) {
            try {
                Thread.sleep(60000);
            } catch (InterruptedException e) {
            }
        }
    }
    private static void loadSource(String rootPath , String name){
        Config conf = ConfigFactory.parseFile(new File(rootPath+"/"+name));
        List<PositionContent> list = JSON.parseArray(JSON.toJSONString(conf.getAnyRefList("screen.monitor")),PositionContent.class);
        Map<String,PositionContent> map = list.stream().collect(Collectors.toMap(PositionContent::getName, Function.identity(), (key1, key2) -> key2));
        screenSource.put(Positions, map);
    }
}
回答
編輯回答
久舊酒

問(wèn)題一:

  1. Collectors.toMap() 的方法簽名是:
* @param <T> the type of the input elements
* @param <K> the output type of the key mapping function
* @param <U> the output type of the value mapping function
* @param keyMapper a mapping function to produce keys
* @param valueMapper a mapping function to produce values
* @param mergeFunction a merge function, used to resolve collisions between
*                      values associated with the same key, as supplied
*                      to {@link Map#merge(Object, Object, BiFunction)}
public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction)

簡(jiǎn)單來(lái)說(shuō),keyMapper 用來(lái)根據(jù) stream 的內(nèi)容生成 HashMap 的鍵,valueMapper 用來(lái)根據(jù) stream 的內(nèi)容生成 HashMap 的值,mergeFunction 是用來(lái)處理 某兩個(gè)值屬于同一個(gè) key 時(shí)使用哪個(gè)值 的。

  1. PositionContent::getNameJava 8 里用來(lái)表示 lambdaeta 轉(zhuǎn)換概念的操作符,這個(gè)你可以去看看 Java 8 函數(shù)式編程 的相關(guān)文章。
  2. Function.identity() 注釋里有講這個(gè)是干嘛的:
Returns a function that always returns its input argument.

返回傳入的參數(shù)

  1. (key1, key2) -> key2 這個(gè)還是 lambda 表達(dá)式,就是剛才那個(gè) mergeFunction,這里的作用是使用新的值覆蓋舊的值。
  2. 總的來(lái)說(shuō),就是把 List<PositionContent> list 里的每個(gè)元素映射到

一個(gè) keyPositionContent 實(shí)例的 namevalue 為當(dāng)前元素的 HashMap。

問(wèn)題二:

這個(gè)點(diǎn)在 javascript 里叫 鏈?zhǔn)秸{(diào)用,簡(jiǎn)單來(lái)說(shuō)就是一個(gè)類(lèi)的方法返回當(dāng)前實(shí)例,這樣就可以一直 .func1().func2() 這樣下去;

具體到這里的例子,在 Java 里這個(gè)叫 構(gòu)造器模式,你可以去了解一下。

2018年5月29日 05:43