<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      Java8 的 Stream 流太難用了?看看 JDFrame

      0
      分享至

      Java精選面試題(微信小程序):5000+道面試題和選擇題,真實面經,簡歷模版,包含Java基礎、并發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!

      0、簡介

      由于經常記不住stream的一些API每次要復制來復制去并且又長又臭,想要更加語意化的api,于是想到了以前寫大數據Spark pandnas 等DataFrame模型時的API, 然后發現其實也存在java的JVM層的DataFrame模型比如 tablesaw,joinery

      但是他們得硬編碼去指定字段名,這對于有代碼潔癖的人實在難以忍受,而且我只是簡單統計下數據,我想在一些場景下能不能使用匿名函數去指定的字段處理去處理,于是便有了這個

      一個jvm層級的仿DataFrame工具,語意化和簡化java8的stream流式處理工具

      1、快速開始 1.1、引入依賴

      
           
      
       io.github.burukeyou groupId>     
      
       jdframe artifactId>     
      
       0.0.2 version> dependency>
      
      
      
      
      1.2、案例

      統計每個學校的里學生年齡不為空并且年齡在9到16歲間的合計分數,并且獲取合計分前2名的學校

      static List studentList =  new ArrayList<>(); static {     studentList.add(new Student(1,"a","一中","一年級",11, new BigDecimal(1)));     studentList.add(new Student(2,"a","一中","一年級",11, new BigDecimal(1)));     studentList.add(new Student(3,"b","一中","三年級",12, new BigDecimal(2)));     studentList.add(new Student(4,"c","二中","一年級",13, new BigDecimal(3)));     studentList.add(new Student(5,"d","二中","一年級",14, new BigDecimal(4)));     studentList.add(new Student(6,"e","三中","二年級",14, new BigDecimal(5)));     studentList.add(new Student(7,"e","三中","二年級",15, new BigDecimal(5))); } // 等價于SQL: // select school,sum(score)   // from students // where age is not null and age >=9 and age <= 16 // group by school // order by sum(score) desc // limit 2 SDFrame > sdf2 = SDFrame.read(studentList)         .whereNotNull(Student::getAge)         .whereBetween(Student::getAge,9,16)         .groupBySum(Student::getSchool, Student::getScore)         .sortDesc(FI2::getC2)         .cutFirst(2); sdf2.show();

      輸出信息:

      c1  c2  三中 10 二中 7 @Data @AllArgsConstructor @NoArgsConstructor publicclass Student {     privateint id;     private String name;     private String school;     private String level;     private Integer age;     private BigDecimal score;     private Integer rank;     public Student(String level, BigDecimal score) {         this.level = level;         this.score = score;     }     public Student(int id, String name, String school, String level, Integer age, BigDecimal score) {         this.id = id;         this.name = name;         this.school = school;         this.level = level;         this.age = age;         this.score = score;     } }
      2、API案例
      2.1、矩陣信息相關

      void show(int n); // 打印矩陣信息到控制臺 List   columns();   // 獲取矩陣的表頭字段名 List   col(Function function) ;   // 獲取矩陣某一列值 T head();                   // 獲取第一個元素 List   head(int n);          // 獲取前n個元素 T tail();                       // 獲取最后一個元素 List   tail(int n);            // 獲取后n個元素
      2.2、篩選相關

      SDFrame.read(studentList)         .whereBetween(Student::getAge,3,6) // 過濾年齡在[3,6]歲的         .whereBetweenR(Student::getAge,3,6) // 過濾年齡在(3,6]歲的, 不含3歲         .whereBetweenL(Student::getAge,3,6)      // 過濾年齡在[3,6)歲的, 不含6歲         .whereNotNull(Student::getName) // 過濾名字不為空的數據, 兼容了空字符串''的判斷         .whereGt(Student::getAge,3)    // 過濾年齡大于3歲         .whereGe(Student::getAge,3)   // 過濾年齡大于等于3歲         .whereLt(Student::getAge,3)  // 過濾年齡小于3歲的         .whereIn(Student::getAge, Arrays.asList(3,7,8)) // 過濾年齡為3歲 或者7歲 或者 8歲的數據         .whereNotIn(Student::getAge, Arrays.asList(3,7,8)) // 過濾年齡不為為3歲 或者7歲 或者 8歲的數據         .whereEq(Student::getAge,3) // 過濾年齡等于3歲的數據         .whereNotEq(Student::getAge,3) // 過濾年齡不等于3歲的數據         .whereLike(Student::getName,"jay") // 模糊查詢,等價于 like "%jay%"         .whereLikeLeft(Student::getName,"jay") // 模糊查詢,等價于 like "jay%"         .whereLikeRight(Student::getName,"jay"); // 模糊查詢,等價于 like "%jay"
      2.3、匯總相關

      JDFrame frame = JDFrame.read(studentList); Student s1 = frame.max(Student::getAge);// 獲取年齡最大的學生 Integer s2  = frame.maxValue(Student::getAge);      // 獲取學生里最大的年齡 Student s3 = frame.min(Student::getAge);// 獲取年齡最小的學生 Integer s4  = frame.minValue(Student::getAge);      // 獲取學生里最小的年齡 BigDecimal s5 = frame.avg(Student::getAge); // 獲取所有學生的年齡的平均值 BigDecimal s6 = frame.sum(Student::getAge); // 獲取所有學生的年齡合計 MaxMin s7 = frame.maxMin(Student::getAge);  // 同時獲取年齡最大和最小的學生 MaxMin s8 = frame.maxMinValue(Student::getAge);  // 同時獲取學生里最大和最小的年齡
      2.4、去重相關

      原生steam只支持對象去重,不支持按特定字段去重

      List std =  null; std = SDFrame.read(studentList).distinct().toLists(); // 根據對象hashCode去重 std = SDFrame.read(studentList).distinct(Student::getSchool).toLists(); // 根據學校名去重 std = SDFrame.read(studentList).distinct(e -> e.getSchool() + e.getLevel()).toLists(); // 根據學校名拼接級別去重復 std =SDFrame.read(studentList).distinct(Student::getSchool).distinct(Student::getLevel).toLists(); // 先根據學校名去除重復再根據級別去除重復
      2.5、簡單分組聚合相關

      類似sql的 group by語義 簡化處理分組和聚合的邏輯, 如果用原生stream需要寫可能一大串邏輯。

      JDFrame frame = JDFrame.from(studentList); // 等價于 select school,sum(age) ... group by school List > a = frame.groupBySum(Student::getSchool, Student::getAge).toLists(); // 等價于 select school,max(age) ... group by school List > a2 = frame.groupByMaxValue(Student::getSchool, Student::getAge).toLists(); //  與 groupByMaxValue 含義一致,只是返回的是最大的值對象 List > a3 = frame.groupByMax(Student::getSchool, Student::getAge).toLists(); // 等價于 select school,min(age) ... group by school List > a4 = frame.groupByMinValue(Student::getSchool, Student::getAge).toLists(); // 等價于 select school,count(*) ... group by school List > a5 = frame.groupByCount(Student::getSchool).toLists(); // 等價于 select school,avg(age) ... group by school List > a6 = frame.groupByAvg(Student::getSchool, Student::getAge).toLists(); // 等價于 select school,sum(age),count(age) group by school List > a7 = frame.groupBySumCount(Student::getSchool, Student::getAge).toLists(); // (二級分組)等價于 select school,level,sum(age),count(age) group by school,level List > a8 = frame.groupBySum(Student::getSchool, Student::getLevel, Student::getAge).toLists(); // (三級分組)等價于 select school,level,name,sum(age),count(age) group by school,level,name List > a9 = frame.groupBySum(Student::getSchool, Student::getLevel, Student::getName, Student::getAge).toLists();
      2.6、排序相關

      簡化原生stream的排序方式,直接指定字段即可,不用使用Comparator還要去關注升序還是降序

      // 等價于 order by age desc SDFrame.read(studentList).sortDesc(Student::getAge); //  等價于 order by age desc, level asc SDFrame.read(studentList).sortDesc(Student::getAge).sortAsc(Student::getLevel); // 等價于 order by age asc SDFrame.read(studentList).sortAsc(Student::getAge); // 使用Comparator 排序 SDFrame.read(studentList).sortAsc(Comparator.comparing(e -> e.getLevel() + e.getId()));
      2.7、連接矩陣相關

      API列表

      append(T t);                    // 等價于集合 add union(IFrame other);          //  等價于集合 addAll join(IFrame other, JoinOn on, Join join);    // 等價于 sql內連接 leftJoin(IFrame other, JoinOn on, Join join);    // 等價于sql左連接,如果左連接失敗,K值為null,需手動判斷 rightJoin(IFrame other, JoinOn on, Join join);     // 等價于sql右連接,如果右連接失敗,T值為null,需手動判斷

      內連接例子:

      System.out.println("======== 矩陣1 ======="); SDFrame sdf = SDFrame.read(studentList); sdf.show(20); // 獲取學生年齡在9到16歲的學學校合計分數最高的前10名 SDFrame > sdf2 = SDFrame.read(studentList)         .whereNotNull(Student::getAge)         .whereBetween(Student::getAge,9,16)         .groupBySum(Student::getSchool, Student::getScore)         .sortDesc(FI2::getC2)         .cutFirst(10); System.out.println("======== 矩陣2 ======="); sdf2.show(); SDFrame frame = sdf.join(sdf2, (a, b) -> a.getSchool().equals(b.getC1()), (a, b) -> {     UserInfo userInfo = new UserInfo();     userInfo.setKey1(a.getSchool());     userInfo.setKey2(b.getC2().intValue());     userInfo.setKey3(String.valueOf(a.getId()));     return userInfo; }); System.out.println("======== 連接后結果 ======="); frame.show(5);

      打印信息:

      ======== 矩陣1 ======= id name school level age score rank  1  a    一中     一年級   111           2  a    一中     一年級   111           3  b    一中     一年級   122           4  c    二中     一年級   133           5  d    二中     一年級   144           6  e    三中     二年級   145           7  e    三中     二年級   155           ======== 矩陣2 ======= c1 c2  三中 10 二中 7 一中 4 ======== 連接后結果 ======= key1 key2 key3 key4  一中   4    1          一中   4    2          一中   4    3          二中   7    4          二中   7    5   

      類似于

      select a.*,b.* from sdf a inner join sdf2 b on  a.school = b.c1
      2.8、其他

      百分數轉換

      // 等價于 select round(score*100,2) from student SDFrame map2 = SDFrame.read(studentList).mapPercent(Student::getScore, Student::setScore, 2);

      分區

      將每個5個元素分成一個小集合,用于將大任務拆成小任務

      List > t = SDFrame.read(studentList).partition( 5).toLists();

      生成序號

      按照age排序,然后根據當前順序生成排序號到rank字段 (序號從0開始)

      SDFrame.read(studentList)     .sortDesc(Student::getAge)     .addSortNoCol(Student::setRank)     .show(30);

      輸出信息:

      id name school level age score rank  7  e    三中     二年級   15  5     0     5  d    二中     一年級   14  4     1     6  e    三中     二年級   14  5     2     4  c    二中     一年級   13  3     3     3  b    一中     三年級   12  2     4     1  a    一中     一年級   11  1     5     2  a    一中     一年級   11  1     6   

      生成排名號

      按照age降序排序,然后根據當前順序生成排名號到rank字段 (排名從0開始)

      與序號不同的是, 排名是如果值相同認為排名一樣。

      SDFrame df = SDFrame.read(studentList).addRankingSameColDesc(Student::getAge, Student::setRank); df.show(20);

      輸出信息

      id name school level age score rank  7  e    三中     二年級   15  5     1     5  d    二中     一年級   14  4     2     6  e    三中     二年級   14  5     2     4  c    二中     一年級   13  3     3     3  b    一中     一年級   12  2     4     1  a    一中     一年級   11  1     5     2  a    一中     一年級   11  1     5    

      補充條目

      1、補充缺失的學校條目

      // 所有需要的學校條目 List allDim = Arrays.asList( "一中","二中","三中","四中"); // 根據學校字段和allDim比較去補充缺失的條目, 缺失的學校按照ReplenishFunction生成補充條目作為結果一起返回 SDFrame.read(studentList).replenish(Student::getSchool,allDim,(school) -> new Student(school)).show();

      輸出

      id name school level age score rank  1  a    一中     一年級   11  1           2  a    一中     一年級   11  1           3  b    一中     一年級   12  2           4  c    二中     一年級   13  3           5  d    二中     一年級   14  4           6  e    三中     二年級   14  5           7  e    三中     二年級   15  5           0       四中  

      2、分組補充組內缺失的條目

      按照學校進行分組, 匯總所有年級allDim. 然后與allDim比較補充每個分組內缺失的年級,缺失的年級按照ReplenishFunction生成補充條目

      SDFrame.read(studentList).replenish(Student::getSchool,Student::getLevel,(school,level) -> new Student(school,level)).show(30);

      輸出

      id name school level age score rank  1  a    一中     一年級   111           2  a    一中     一年級   111           3  b    一中     三年級   122           0       一中     二年級                   4  c    二中     一年級   133           5  d    二中     一年級   144           0       二中     三年級                   0       二中     二年級                   6  e    三中     二年級   145           7  e    三中     二年級   155           0       三中     一年級                   0       三中     三年級 

      應用場景舉例:要求計算近兩年每個月的數據,但是數據的年月可能不全,這時就補充缺失的年月數據作為結果一起返回。

      最后

      代碼地址:

      https://github.com/burukeYou/JDFrame

      Maven依賴地址:

      https://central.sonatype.com/artifact/io.github.burukeyou/jdframe

      提供了兩種Frame,SDFrame和JDFrame 在API層面一模一樣, 區別是JDFrame的所有操作實時生效, 無需要重新read生成,而SDFrame與stream流一致,只有執行終止操作才會生效,并且需要重新read生成流, 而且在同一個流之間的操作是互相影響的。

      如果只是需要流式操作一條流執行完就用SDFrame, 如果需要“中間站點”數據,然后從“中間站點數據“開始計算就用JDFrame, 這個在含義層面與DataFrame模型類似。

      這個在語法層面能實現的矩陣還是比較有限的因為行列是通過枚舉的幾個FI去描述,但是不同的邏輯導致的矩陣變換的變化可能是非常大的,除非JDK能語法層面支持到吧或者放棄強類型全部硬編碼才能實現各種矩陣的表示和變換。期待JDK一個JVM層面的“pandans” 出現。

      還有一些api沒有列舉出來使用的比較少

      主要是對邏輯的封裝和語意化,如果還有哪些邏輯和api可以擴展可以在評論區留下你的想法。

      來源:https://juejin.cn/post/7356652717392740404

      公眾號“Java精選”所發表內容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯系,筆者會第一時間刪除處理!

      最近有很多人問,有沒有技術或摸魚交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!在線摸魚:https://www.yoodb.com/

      文章有幫助的話,點在看,轉發吧!

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      大連旅順一座老塔剛傳出要拆,日本立馬跳腳,開口就討“廢料”

      大連旅順一座老塔剛傳出要拆,日本立馬跳腳,開口就討“廢料”

      百態人間
      2025-12-19 16:48:22
      華子轟26+12仍無緣今日最佳!對不起,你碰到不講理的文班亞馬了

      華子轟26+12仍無緣今日最佳!對不起,你碰到不講理的文班亞馬了

      世界體育圈
      2025-12-20 13:38:48
      “成都27歲女子家門口被殺案”宣判,法院認為被告人行為不構成自首

      “成都27歲女子家門口被殺案”宣判,法院認為被告人行為不構成自首

      澎湃新聞
      2025-12-20 15:06:27
      “英國關之琳”閃婚大25歲白頭大叔,全網崩潰:垃圾堆里找男人?

      “英國關之琳”閃婚大25歲白頭大叔,全網崩潰:垃圾堆里找男人?

      陳天宇
      2025-12-20 00:04:13
      臺北市長蔣萬安將赴上海,行程曝光

      臺北市長蔣萬安將赴上海,行程曝光

      第一財經資訊
      2025-12-19 21:59:17
      小米17 Ultra代號夜神 盧偉冰:絕對是最強Ultra

      小米17 Ultra代號夜神 盧偉冰:絕對是最強Ultra

      快科技
      2025-12-20 22:58:07
      楊晨成國安新帥最大黑馬!球迷呼吁名宿回歸,德甲背景成關鍵優勢

      楊晨成國安新帥最大黑馬!球迷呼吁名宿回歸,德甲背景成關鍵優勢

      光輝與陰暗
      2025-12-20 23:57:45
      碾壓,曼城英超對陣西漢姆聯已連續20場不敗+7連勝

      碾壓,曼城英超對陣西漢姆聯已連續20場不敗+7連勝

      懂球帝
      2025-12-21 01:17:58
      邢自強:如果房地產不實現止跌回穩,很難打破消費疲軟等問題

      邢自強:如果房地產不實現止跌回穩,很難打破消費疲軟等問題

      新浪財經
      2025-12-18 15:48:03
      陳志的可怕,不在他有多狠,而在于他一路順風順水

      陳志的可怕,不在他有多狠,而在于他一路順風順水

      熱點菌本君
      2025-11-10 15:45:57
      2025國劇最高分!《反人類暴行》豆瓣開分8.5

      2025國劇最高分!《反人類暴行》豆瓣開分8.5

      新京報
      2025-12-19 17:46:22
      驚心動魄!60歲老人因意外“頭頸分離”直送ICU,經廣州醫生搶救獲重生

      驚心動魄!60歲老人因意外“頭頸分離”直送ICU,經廣州醫生搶救獲重生

      極目新聞
      2025-12-20 08:38:15
      網友們終于把蒸汽機發明這事給理明白了

      網友們終于把蒸汽機發明這事給理明白了

      清暉有墨
      2025-11-24 14:01:50
      早就想打!日媒首次爆料:中國雙航母出動時日軍戰機已做戰斗準備

      早就想打!日媒首次爆料:中國雙航母出動時日軍戰機已做戰斗準備

      詩意世界
      2025-08-21 13:13:50
      國際足聯官宣,登貝萊再破天花板,讓梅西和整個體壇都“沉默”了

      國際足聯官宣,登貝萊再破天花板,讓梅西和整個體壇都“沉默”了

      負面黑洞
      2025-12-20 07:31:41
      摩爾線程發布新一代GPU架構“花港”:能效提升10倍,支持十萬卡以上智算集群

      摩爾線程發布新一代GPU架構“花港”:能效提升10倍,支持十萬卡以上智算集群

      澎湃新聞
      2025-12-20 10:48:26
      俄羅斯沒想到,美國更沒想到,如今的中國石油,成為石油遙遙領先

      俄羅斯沒想到,美國更沒想到,如今的中國石油,成為石油遙遙領先

      生活新鮮市
      2025-12-20 16:24:32
      荷蘭不給晶圓,聞泰有新招

      荷蘭不給晶圓,聞泰有新招

      觀察者網
      2025-12-20 08:36:14
      連場轟20+!中國女籃26歲2米王牌閃耀:升聯盟第2,宮帥招她嗎?

      連場轟20+!中國女籃26歲2米王牌閃耀:升聯盟第2,宮帥招她嗎?

      李喜林籃球絕殺
      2025-12-20 16:09:28
      中日交惡,錯在中方?第二個指責我國的出現,點名中國用詞激烈

      中日交惡,錯在中方?第二個指責我國的出現,點名中國用詞激烈

      肖茲探秘說
      2025-11-25 13:12:05
      2025-12-21 01:51:00
      Java精選
      Java精選
      一場永遠也演不完的戲
      1764文章數 3859關注度
      往期回顧 全部

      科技要聞

      許四清:具身智能的"ChatGPT時刻"還未到來

      頭條要聞

      印度官員:若"臺灣有事" 印度不太可能像西方那樣回應

      頭條要聞

      印度官員:若"臺灣有事" 印度不太可能像西方那樣回應

      體育要聞

      我開了20年大巴,現在是一名西甲主帥

      娛樂要聞

      2026央視跨年晚會陣容曝光,豪華陣仗

      財經要聞

      求解“地方財政困難”

      汽車要聞

      嵐圖推進L3量產測試 已完成11萬公里實際道路驗證

      態度原創

      家居
      房產
      手機
      公開課
      軍事航空

      家居要聞

      高端私宅 理想隱居圣地

      房產要聞

      廣州有態度,一座國際化社區給出的城市答案

      手機要聞

      vivo X200T再曝,天璣 9400+芯片加持

      公開課

      李玫瑾:為什么性格比能力更重要?

      軍事要聞

      澤連斯基:前線局勢愈發艱難

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 亚洲AV日韩AV永久无码网站| 男人天堂2024在线| 两女女百合互慰av赤裸无遮挡| 隔壁老王国产在线精品| 好吊av| 亚洲性爱电影| 久久久久综合中文字幕| 无码av免费毛片一区二区| 国内成人综合| 在线无码| 久久精品国产亚洲av麻豆小说| 国产男女猛烈无遮挡免费网站| 精品国产av无码一区二区三区| 9一传媒| jizz18| 一区二区丝袜美腿视频| 性欧美长视频免费观看不卡| 亚洲欧美中文日韩在线v日本| 99精品视频在线观看| 天堂中文字幕| 无码人妻斩一区二区三区| 熟妇人妻无乱码中文字幕真矢织江| 亚洲精品不卡无码福利在线观看 | 无遮挡又爽又刺激的视频| 人人综合亚洲无线码另类| 狠狠躁天天躁日日躁97| 乱乱网| 免费观看全黄做爰大片| 日韩大片在线永久免费观看网站| 色综合色天天久久婷婷基地| 九九国产视频| 亚洲精品自拍| 无码人妻中文字幕| 色老头亚洲成人免费影院| 日本最新免费二区三区| 日韩免费无码人妻波多野| 亚洲?欧美?自拍?另类?日韩?人妻| 亚洲脚交| 3P视频在线| 国产亚洲精品??码| 高清dvd碟片 生活片|