Java Lambda 表達式提升效率

  • lambda 表達式的應用場景

  • Stream 的應用場景

  • Lambda/Stream 的進一步封裝

自定義函數式接口(用?jdk?自帶的函數式接口也可以)

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

import java.io.Serializable;/*** 可序列化的Functional** @author VampireAchao*/
@FunctionalInterface
public interface Func<T, R> extends Serializable {/*** 調用** @param t 參數* @return 返回值*/R apply(T t);
}/*** 可序列化的函數式接口實現類** @author VampireAchao*/
public class FuncImpl implements Func<Object, String> {/*** 調用** @param o 參數* @return 返回值*/@Overridepublic String apply(Object o) {return o.toString();}
}Func<String, Integer> func = new Func<String, Integer>() {/*** 調用** @param s 參數* @return 返回值*/@Overridepublic Integer apply(String s) {return s.hashCode();}};

Lambda?這種簡寫的形式

java.util.stream (Java Platform SE 8 )

 Func<String, String> func1 = (String s) -> {return s.toUpperCase();};Func<String, String> func2 = (String s) -> s.toUpperCase();
Func<String, String> func3 = s -> s.toUpperCase();
Func<String, String> func4 = String::toUpperCase;import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Supplier;/*** 語法糖——方法引用** @author VampireAchao*/
public class MethodReferences {public static Object staticSupplier() {return "whatever";}public Object instanceSupplier() {return "whatever";}public Object anonymousInstanceFunction() {return "whatever";}public static void main(String[] args) {// 引用構造函數Supplier<MethodReferences> conSup = () -> new MethodReferences();conSup = MethodReferences::new;// 數組構造函數引用IntFunction<int[]> intFunction = value -> new int[value];// intFunc == new int[20];int[] intFuncResult = intFunction.apply(20);// 引用靜態方法Supplier<Object> statSup = () -> staticSupplier();statSup = MethodReferences::staticSupplier;Object statSupResult = statSup.get();// 引用特定對象的實例方法Supplier<Object> instSup = new MethodReferences()::instanceSupplier;instSup = new MethodReferences()::instanceSupplier;Object instSupResult = instSup.get();// 引用特定類型的任意對象的實例方法Function<MethodReferences, Object> anonInstFunc = streamDemo -> streamDemo.anonymousInstanceFunction();anonInstFunc = MethodReferences::anonymousInstanceFunction;}}

jdk?自帶的函數式接口寫法

import java.math.BigDecimal;
import java.util.function.*;/*** 常用的幾個函數式接口寫法** @author VampireAchao*/
class Usual {public static Consumer<Object> consumer() {// 有參數無返回值return o -> {};}public static Function<Integer, Object> function() {// 有參數有返回值return o -> o;}public static Predicate<Object> predicate() {// 有參數,返回值為booleanreturn o -> true;}public static Supplier<Object> supplier() {// 無參數有返回值return Object::new;}public static BiConsumer<String, Integer> biConsumer() {// 倆參數無返回值return (q, o) -> {};}public static BiFunction<Integer, Long, BigDecimal> biFunction() {// 倆參數,有返回值return (q, o) -> new BigDecimal(q).add(BigDecimal.valueOf(o));}public static UnaryOperator<Object> unaryOperator() {// 一個參數,返回值類型和參數一樣return q -> q;}public static BinaryOperator<Object> binaryOperator() {// 倆參數和返回值類型保持一致return (a, o) -> a;}}

Java 8 API?的抽象稱為流?Stream

java.util.stream (Java Platform SE 8 )

    // 聲明式編程是告訴計算機需要計算“什么”而不是“如何”去計算// 現在,我想要一個List,包含3個數字6List<Integer> sixSixSix =// 我想要:Stream// 數字6.generate(() -> 6)// 3個.limit(3)// 最后收集起來轉為List.collect(Collectors.toList());sixSixSix.forEach(System.out::print);//Stream 使用一種類似用 SQL 語句從數據庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。// 就像sql里的排序、截取// 我要把傳入的list逆序,然后從第五個(元素下標為4)開始取值,取4條abc = abc.stream()// 排序(按照自然順序的逆序).sorted(Comparator.reverseOrder())// 從下標為4開始取值.skip(4)// 取4條.limit(4)// 最后收集起來轉為List.collect(Collectors.toList());System.out.println("我要把傳入的list逆序,然后從第五個(元素下標為4)開始取值,取4條");abc.forEach(System.out::print);System.out.println();/*** 老辦法實現一個list,存儲3個6** @return [6, 6, 6]*/private static List<Integer> oldSix() {// 老辦法List<Integer> sixSixSix = new ArrayList<>(3);sixSixSix.add(6);sixSixSix.add(6);sixSixSix.add(6);System.out.println("老辦法實現一個list,存儲3個6");for (Integer integer : sixSixSix) {System.out.print(integer);}System.out.println();return sixSixSix;}/*** 新方法實現一個list,存儲3個6** @return [6, 6, 6]*/private static List<Integer> newSix() {List<Integer> sixSixSix = Stream.generate(() -> 6).limit(3).collect(Collectors.toList());System.out.println("新方法實現一個list,存儲3個6");sixSixSix.forEach(System.out::print);System.out.println();return sixSixSix;}// 管道中傳輸,節點中處理int pipe = abc.stream()// 篩選.filter(i -> i > 'G')// 排序.sorted(Comparator.reverseOrder()).mapToInt(Object::hashCode)// 聚合.sum();System.out.println("將26個字母組成的集合過濾出大于'G'的,逆序,再獲取hashCode值,進行求和");System.out.println(pipe);//元素流在管道中經過中間操作(intermediate operation)的處理,最后由最終操作 (terminal operation) 得到前面處理的結果。// 將26個大寫字母Character集合轉換為String然后轉換為小寫字符List<String> terminalOperation = abc.stream()// 中間操作(intermediate operation).map(String::valueOf).map(String::toLowerCase)// 最終操作(terminal operation).collect(Collectors.toList());System.out.println("26個大寫字母Character集合,轉換成String然后轉換為小寫字符,收集起來");terminalOperation.forEach(System.out::print);System.out.println();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75486.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

keep-alive緩存

#keep-alive緩存動態路由的使用指南# 代碼如下圖 &#xff1a; <router-view v-slot"{ Component }"> <keep-alive :include"[Hot, Notifications, User, Setting, Test]"> <component :is"Component" …

使用 PyTorch 的 `GradualWarmupScheduler` 實現學習率預熱

使用 PyTorch 的 GradualWarmupScheduler 實現學習率預熱 在深度學習中,學習率(Learning Rate, LR)是影響模型訓練效果的關鍵超參數之一。為了提升模型的收斂速度和穩定性,學習率調度策略變得尤為重要。其中,學習率預熱(Learning Rate Warmup) 是一種常用的策略,它通過…

【DLI】Generative AI with Diffusion Models通關秘籍

Generative AI with Diffusion Models&#xff0c;加載時間在20分鐘左右&#xff0c;耐心等待。 6.2TODO 這里是在設置擴散模型的參數&#xff0c;代碼里的FIXME部分需要根據上下文進行替換。以下是各個FIXME的替換說明&#xff1a; 1.a_bar 是 a 的累積乘積&#xff0c;在 …

如何在本地部署魔搭上千問Qwen2.5-VL-32B-Instruct-AWQ模型在顯卡1上面運行推理,并開啟api服務

環境: 云服務器Ubuntu NVIDIA H20 96GB Qwen2.5-VL-32B Qwen2.5-VL-72B 問題描述: 如何在本地部署魔搭上千問Qwen2.5-VL-32B-Instruct-AWQ模型在顯卡1上面運行推理,并開啟api服務 解決方案: 1.環境準備 硬件要求 顯卡1(顯存需≥48GB,推薦≥64GB)CUDA 11.7或更高…

基于方法分類的無監督圖像去霧論文

在之前的博客中&#xff0c;我從研究動機的角度對無監督圖像去霧論文進行了分類&#xff0c;而現在我打算根據論文中提出的方法進行新的分類。 1. 基于對比學習的方法 2022年 論文《UCL-Dehaze: Towards Real-world Image Dehazing via Unsupervised Contrastive Learning》&a…

4月3號.

JDK7前時間相關類: 時間的相關知識: Data時間類: //1.創建對象表示一個時間 Date d1 new Date(); //System.out.println(d1);//2.創建對象表示一個指定的時間 Date d2 new Date(0L); System.out.println(d2);//3.setTime修改時間 //1000毫秒1秒 d2.setTime(1000L); System.o…

數據結構與算法:子數組最大累加和問題及擴展

前言 子數組最大累加和問題看似簡單,但能延伸出的題目非常多,千題千面,而且會和其他算法結合出現。 一、最大子數組和 class Solution { public:int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int>dp(n);//i位置往左能延伸出的最大累加…

MIT6.828 Lab3-2 Print a page table (easy)

實驗內容 實現一個函數來打印頁表的內容&#xff0c;幫助我們更好地理解 xv6 的三級頁表結構。 修改內容 kernel/defs.h中添加函數聲明&#xff0c;方便其它函數調用 void vmprint(pagetable_t);// lab3-2 Print a page tablekernel/vm.c中添加函數具體定義 采用…

2025高頻面試設計模型總結篇

文章目錄 設計模型概念單例模式工廠模式策略模式責任鏈模式 設計模型概念 設計模式是前人總結的軟件設計經驗和解決問題的最佳方案&#xff0c;它們為我們提供了一套可復用、易維護、可擴展的設計思路。 &#xff08;1&#xff09;定義&#xff1a; 設計模式是一套經過驗證的…

Java基礎:面向對象進階(二)

01-static static修飾成員方法 static注意事項&#xff08;3種&#xff09; static應用知識&#xff1a;代碼塊 static應用知識&#xff1a;單列模式 02-面向對象三大特征之二&#xff1a;繼承 什么是繼承&#xff1f; 使用繼承有啥好處? 權限修飾符 單繼承、Object類 方法重…

Spring框架如何做EhCache緩存?

在Spring框架中&#xff0c;緩存是一種常見的優化手段&#xff0c;用于減少對數據庫或其他資源的訪問次數&#xff0c;從而提高應用性能。Spring提供了強大的緩存抽象&#xff0c;支持多種緩存實現&#xff08;如EhCache、Redis、Caffeine等&#xff09;&#xff0c;并可以通過…

NVIDIA顯卡

NVIDIA顯卡作為全球GPU技術的標桿&#xff0c;其產品線覆蓋消費級、專業級、數據中心、移動計算等多個領域&#xff0c;技術迭代貫穿架構創新、AI加速、光線追蹤等核心方向。以下從技術演進、產品矩陣、核心技術、生態布局四個維度展開深度解析&#xff1a; 一、技術演進&…

【BUG】生產環境死鎖問題定位排查解決全過程

目錄 生產環境死鎖問題定位排查解決過程0. 表面現象1. 問題分析&#xff08;1&#xff09;數據庫連接池資源耗盡&#xff08;2&#xff09;數據庫鎖競爭(3) 代碼實現問題 2. 分析解決(0) 分析過程&#xff08;1&#xff09;優化數據庫連接池配置&#xff08;2&#xff09;優化數…

【計算機網絡應用層】

文章目錄 計算機網絡應用層詳解一、前言二、應用層的功能三、常見的應用層協議1. HTTP/HTTPS&#xff08;超文本傳輸協議&#xff09;2. DNS&#xff08;域名系統&#xff09;3. FTP&#xff08;文件傳輸協議&#xff09;4. SMTP/POP3/IMAP&#xff08;電子郵件協議&#xff09…

Linux 虛擬化方案

一、Linux 虛擬化技術分類 1. 全虛擬化 (Full Virtualization) 特點&#xff1a;Guest OS 無需修改&#xff0c;完全模擬硬件 代表技術&#xff1a; KVM (Kernel-based Virtual Machine)&#xff1a;主流方案&#xff0c;集成到 Linux 內核 QEMU&#xff1a;硬件模擬器&…

樹莓派 5 換清華源

首先備份原設置 cp /etc/apt/sources.list ~/sources.list.bak cp /etc/apt/sources.list.d/raspi.list ~/raspi.list.bak修改配置 /etc/apt/sources.list 文件替換內容如下&#xff08;原內容刪除&#xff09; deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm …

WGAN原理及實現(pytorch版)

WGAN原理及實現 一、WGAN原理1.1 原始GAN的缺陷1.2 Wasserstein距離的引入1.3 Kantorovich-Rubinstein對偶1.4 WGAN的優化目標1.4 數學推導步驟1.5 權重裁剪 vs 梯度懲罰1.6 優勢1.7 總結 二、WGAN實現2.1 導包2.2 數據加載和處理2.3 構建生成器2.4 構建判別器2.5 訓練和保存模…

Unity網絡開發基礎 (3) Socket入門 TCP同步連接 與 簡單封裝練習

本文章不作任何商業用途 僅作學習與交流 教程來自Unity唐老獅 關于練習題部分是我觀看教程之后自己實現 所以和老師寫法可能不太一樣 唐老師說掌握其基本思路即可,因為前端程序一般不需要去寫后端邏輯 1.認識Socket的重要API Socket是什么 Socket&#xff08;套接字&#xff0…

【linux】一文掌握 ssh和scp 指令的詳細用法(ssh和scp 備忘速查)

文章目錄 入門連接執行SCP配置位置SCP 選項配置示例ProxyJumpssh-copy-id SSH keygenssh-keygen產生鑰匙類型known_hosts密鑰格式 此快速參考備忘單提供了使用 SSH 的各種方法。 參考&#xff1a; OpenSSH 配置文件示例 (cyberciti.biz)ssh_config (linux.die.net) 入門 連…

真實筆試題

文章目錄 線程題樹的深度遍歷 線程題 實現一個類支持100個線程同時向一個銀行賬戶中存入一元錢.需通過同步機制消除競態條件,當所有線程執行完成后,賬戶余額必須精確等于100元 package com.itheima.thread;public class ShowMeBug {private double balance; // 賬戶余額priva…