JAVA8 Collector接口掠過

JAVA8 Collector接口

Collector接口如下
public interface Collector<T, A, R> {
    Supplier<A> supplier();
    BiConsumer<A, T> accumulator();
    BinaryOperator<A> combiner();
    Function<A, R> finisher();
    Set<Characteristics> characteristics();
}

<T,A,R> 的意義:

T是供應(yīng)源 A是累加器 R是組合器
一、例子一:

自己寫 toList() 的實現(xiàn)

public class ToCollectionList<T> implements Collector<T, List<T>, List<T>>{
    @Override
    //供應(yīng)源--建立新的結(jié)果容器
    public Supplier<List<T>> supplier() {
        return ArrayList::new;
    }
    @Override
    //累加器--將元素添加到結(jié)果容器中
    public BiConsumer<List<T>, T> accumulator() {
        return List::add;
    }
    @Override
    //組合器--合并兩個結(jié)果容器
    public BinaryOperator<List<T>> combiner() {
        return (listA, listB) -> {
            listA.addAll(listB);
            return listA;
        };
    }
    @Override
    //恒等函數(shù)--對結(jié)果容器應(yīng)用轉(zhuǎn)換
    public Function<List<T>, List<T>> finisher() {
        return Function.identity();
    }
    @Override
    //返回不可變Characteristics,定義收集器的行為,尤其是是否進行并行歸約
    public Set<Characteristics> characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT));
    }
}
二授瘦、例子二:

比自帶partitioningBy 性能更強的 分區(qū)實現(xiàn)(質(zhì)數(shù))

public class FuckPrime implements Collector<Integer, Map<Boolean, List<Integer>>, Map<Boolean, List<Integer>>> {

    @Override
    public Supplier<Map<Boolean, List<Integer>>> supplier() {
        return () -> new HashMap<Boolean, List<Integer>>() {

            private static final long serialVersionUID = -2542842140223455161L;

            {
                put(true, new ArrayList<Integer>());
                put(false, new ArrayList<Integer>());
            }
        };
    }

    @Override
    public BiConsumer<Map<Boolean, List<Integer>>, Integer> accumulator() {
        return (Map<Boolean, List<Integer>> map, Integer can) -> {
            map.get(isPrime(map.get(true), can)).add(can);
        };
    }

    @Override
    public BinaryOperator<Map<Boolean, List<Integer>>> combiner() {
        return (Map<Boolean, List<Integer>> map1, Map<Boolean, List<Integer>> map2) -> {
            map1.get(true).addAll(map2.get(true));
            map1.get(false).addAll(map2.get(false));
            return map1;
        };
    }

    @Override
    public Function<Map<Boolean, List<Integer>>, Map<Boolean, List<Integer>>> finisher() {
        return Function.identity();
    }

    @Override
    public Set<java.util.stream.Collector.Characteristics> characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));
    }

    private static boolean isPrime(List<Integer> list, int can) {
        int canRoot = (int) Math.sqrt((double) can);
        return takeWhile(list, i -> i <= canRoot).stream().noneMatch(p -> can % p == 0);
    }

    private static boolean isPrime2(int num) {
        int num2 = (int) Math.sqrt((double) num);
        return IntStream.rangeClosed(2, num2).noneMatch(t -> num % t == 0);
    }

    private static <T> List<T> takeWhile(List<T> list, Predicate<T> p) {
        int i = 0;
        for (T t : list) {
            if (!p.test(t)) {
                return list.subList(0, i);
            }
            i++;
        }
        return list;
    }

    public static Map<Boolean, List<Integer>> getPrime(int n) {
        return IntStream.rangeClosed(2, n).boxed().collect(new FuckPrime());
    }

    public static Map<Boolean, List<Integer>> getPrime2(int n) {
        return IntStream.rangeClosed(2, n).boxed().collect(Collectors.partitioningBy(i -> isPrime2(i)));
    }

    public static void main(String[] args) {
        Long s = System.nanoTime();
        for (int i = 0; i <= 10; i++) {
            getPrime(1_000_000);
        }
        Long e = System.nanoTime();
        System.out.println("自寫方法耗時:" + (e - s) / 1_000_000 + "ms");

        Long s2 = System.nanoTime();
        for (int i = 0; i <= 10; i++) {
            getPrime2(1_000_000);
        }
        Long e2 = System.nanoTime();
        System.out.println("Stream分區(qū)方法耗時:" + (e2 - s2) / 1_000_000 + "ms");
    }
}

10次1000000內(nèi)搜索結(jié)果:

自寫方法耗時:3015ms
Stream分區(qū)方法耗時:4785ms
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喉酌,隨后出現(xiàn)的幾起案子完箩,更是在濱河造成了極大的恐慌,老刑警劉巖宽闲,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众眨,死亡現(xiàn)場離奇詭異,居然都是意外死亡容诬,警方通過查閱死者的電腦和手機娩梨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來览徒,“玉大人狈定,你說我怎么就攤上這事。” “怎么了纽什?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵措嵌,是天一觀的道長。 經(jīng)常有香客問我芦缰,道長企巢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任让蕾,我火速辦了婚禮浪规,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涕俗。我一直安慰自己罗丰,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布再姑。 她就那樣靜靜地躺著萌抵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪元镀。 梳的紋絲不亂的頭發(fā)上绍填,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音栖疑,去河邊找鬼讨永。 笑死,一個胖子當著我的面吹牛遇革,可吹牛的內(nèi)容都是我干的卿闹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼萝快,長吁一口氣:“原來是場噩夢啊……” “哼锻霎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揪漩,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤旋恼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奄容,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冰更,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年昂勒,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜀细。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡戈盈,死狀恐怖奠衔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤涣觉,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站血柳,受9級特大地震影響官册,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜难捌,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一膝宁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧根吁,春花似錦员淫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沃斤,卻和暖如春圣蝎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衡瓶。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工徘公, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哮针。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓关面,卻偏偏與公主長得像,于是被迫代替她去往敵國和親十厢。 傳聞我的和親對象是個殘疾皇子等太,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Java8 in action 沒有共享的可變數(shù)據(jù),將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說的函數(shù)式...
    鐵牛很鐵閱讀 1,213評論 1 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理寿烟,服務(wù)發(fā)現(xiàn)澈驼,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 原文地址 http://blog.csdn.net/myherux/article/details/7185511...
    Vissioon閱讀 670評論 0 0
  • 收集器簡介 Collector 函數(shù)式編程相對于指令式編程的一個主要優(yōu)勢:你只需要指出希望的結(jié)果“做什么”筛武,而不用...
    潯它芉咟渡閱讀 808評論 0 4
  • Java 8自Java 5(發(fā)行于2004)以來最具革命性的版本缝其。Java 8 為Java語言、編譯器徘六、類庫内边、開發(fā)...
    誰在烽煙彼岸閱讀 886評論 0 4