Reactive編程入門:Project Reactor 深度指南

在這里插入圖片描述

文章目錄

      • 4.2.1 創建 Flux 和 Mono
        • Flux 基礎創建方式
        • 高級創建模式
        • Mono 創建方式
      • 4.2.2 訂閱與數據處理
        • 基礎訂閱模式
        • 數據處理操作符
      • 4.2.3 核心操作符深度解析
        • flatMap 操作符
        • zip 操作符
        • buffer 操作符
      • 高級組合模式
        • 復雜流處理示例
        • 背壓處理策略
      • 測試響應式流
      • 性能優化技巧
  • React 編程核心技巧與最佳實踐
    • 一、組件設計技巧
      • 1. 組件拆分原則
      • 2. 組件復用策略
    • 二、狀態管理技巧
      • 1. 狀態提升與降級
      • 2. 復雜狀態管理
    • 三、性能優化技巧
      • 1. 減少不必要的渲染
      • 2. 虛擬化長列表
    • 四、Hooks高級技巧
      • 1. 自定義Hooks模式
      • 2. 副作用管理
    • 五、TypeScript集成技巧
      • 1. 類型定義最佳實踐
    • 六、測試技巧
      • 1. 單元測試策略
    • 七、架構與模式
      • 1. 設計系統集成
      • 2. 微前端集成
    • 八、調試技巧
      • 1. 高效調試工具
      • 2. 錯誤邊界處理

在這里插入圖片描述

Project Reactor 是一個基于 Reactive Streams 規范的響應式編程庫,為Java提供了強大的異步數據流處理能力。本節將深入探討 Reactor 的核心組件 Flux 和 Mono,并通過豐富示例展示如何構建響應式應用。

4.2.1 創建 Flux 和 Mono

在這里插入圖片描述

Flux 基礎創建方式

Flux 代表包含0到N個元素的異步序列,以下是5種基礎創建方式:

// 1. 從值序列創建
Flux<String> fruitFlux = Flux.just("Apple", "Orange", "Grape");// 2. 從數組創建
String[] fruits = new String[] {"Apple", "Orange", "Grape"};
Flux<String> arrayFlux = Flux.fromArray(fruits);// 3. 從集合創建
List<String> fruitList = Arrays.asList("Apple", "Orange", "Grape");
Flux<String> iterableFlux = Flux.fromIterable(fruitList);// 4. 從Stream創建
Stream<String> fruitStream = fruitList.stream();
Flux<String> streamFlux = Flux.fromStream(fruitStream);// 5. 范圍生成
Flux<Integer> rangeFlux = Flux.range(1, 5); // 生成1-5的整數
高級創建模式
// 1. 間隔生成(每秒生成一個遞增數字)
Flux<Long> intervalFlux = Flux.interval(Duration.ofSeconds(1)).take(5); // 只取前5個// 2. 動態生成(可控制生成邏輯)
Flux<String> generateFlux = Flux.generate(() -> 0, // 初始狀態(state, sink) -> {sink.next("Value " + state);if (state == 10) sink.complete();return state + 1;});// 3. 合并多個Flux
Flux<String> mergedFlux = Flux.merge(Flux.just("A", "B", "C"),Flux.just("D", "E", "F")
);
Mono 創建方式

Mono 代表最多包含1個元素的異步結果:

// 1. 從單值創建
Mono<String> mono = Mono.just("Single Value");// 2. 空Mono
Mono<String> emptyMono = Mono.empty();// 3. 從Callable創建
Mono<String> callableMono = Mono.fromCallable(() -> {// 模擬耗時操作Thread.sleep(1000);return "Result from callable";
});// 4. 從Future創建
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Future Result");
Mono<String> futureMono = Mono.fromFuture(future);// 5. 延遲創建
Mono<String> deferredMono = Mono.defer(() -> Mono.just("Created at subscription time: " + System.currentTimeMillis())
);

4.2.2 訂閱與數據處理

在這里插入圖片描述

基礎訂閱模式
// 1. 最簡單訂閱(只處理數據)
Flux.range(1, 3).subscribe(System.out::println);// 2. 完整訂閱(處理數據、錯誤和完成信號)
Flux.range(1, 3).subscribe(data -> System.out.println("Received: " + data),err -> System.err.println("Error: " + err),() -> System.out.println("Completed"));// 3. 帶背壓控制的訂閱
Flux.range(1, 100).subscribe(new BaseSubscriber<Integer>() {@Overrideprotected void hookOnSubscribe(Subscription subscription) {request(5); // 初始請求5個元素}@Overrideprotected void hookOnNext(Integer value) {System.out.println("Received: " + value);if (value % 5 == 0) {request(5); // 每處理5個再請求5個}}});
數據處理操作符
// 1. 過濾和映射
Flux.range(1, 10).filter(n -> n % 2 == 0)  // 只保留偶數.map(n -> n * 2)          // 每個元素乘以2.subscribe(System.out::println);// 2. 收集結果
Flux.just("apple", "banana", "orange").collectList()            // 收集為List.subscribe(list -> System.out.println("Fruits: " + list));// 3. 錯誤處理
Flux.just(1, 2, 0, 4).map(i -> 10 / i)         // 除零會拋出異常.onErrorResume(e -> {     // 錯誤恢復System.err.println("Error: " + e.getMessage());return Flux.just(-1);  // 返回備用值}).subscribe(System.out::println);

4.2.3 核心操作符深度解析

flatMap 操作符

flatMap 將每個元素轉換為新的Publisher,然后扁平化為單個Flux:

// 1. 基本用法
Flux.just("user1", "user2").flatMap(username -> Mono.fromCallable(() -> fetchUserDetails(username))).subscribe(System.out::println);// 2. 控制并發度
Flux.range(1, 100).flatMap(id -> fetchUserAsync(id),  // 異步獲取用戶10                   // 最大并發請求數).subscribe();// 3. 保留順序的flatMap
Flux.just(1, 2, 3).flatMapSequential(i -> Mono.delay(Duration.ofMillis(100 - i*10)).thenReturn(i)).subscribe(System.out::println); // 仍保持1,2,3順序
zip 操作符

zip 將多個源按元素一一組合:

// 1. 兩個Flux組合
Flux<String> names = Flux.just("Alice", "Bob", "Charlie");
Flux<Integer> ages = Flux.just(25, 30, 35);Flux.zip(names, ages).map(tuple -> tuple.getT1() + " is " + tuple.getT2() + " years old").subscribe(System.out::println);// 2. 自定義組合函數
Flux.zip(names,ages,(name, age) -> name + "(" + age + ")"
).subscribe(System.out::println);// 3. 多個源組合
Flux<String> hobbies = Flux.just("Reading", "Swimming", "Hiking");Flux.zip(names, ages, hobbies).map(tuple -> tuple.getT1() + " is " + tuple.getT2() + " and likes " + tuple.getT3()).subscribe(System.out::println);
buffer 操作符

buffer 將元素收集到集合中分批處理:

// 1. 固定大小緩沖
Flux.range(1, 10).buffer(3)  // 每3個元素一組.subscribe(list -> System.out.println("Batch: " + list));// 輸出:
// Batch: [1, 2, 3]
// Batch: [4, 5, 6]
// Batch: [7, 8, 9]
// Batch: [10]// 2. 時間窗口緩沖
Flux.interval(Duration.ofMillis(100)).buffer(Duration.ofSeconds(1))  // 每秒收集一次.take(3)  // 只取前3批.subscribe(list -> System.out.println("Items in last second: " + list.size()));// 3. 條件觸發緩沖
Flux.range(1, 20).bufferUntil(i -> i % 5 == 0)  // 遇到能被5整除的數時觸發.subscribe(list -> System.out.println("Buffer: " + list));// 4. 重疊緩沖
Flux.range(1, 10).buffer(3, 1)  // 大小3,步長1(每次前進1個元素).subscribe(list -> System.out.println("Overlapping: " + list));

高級組合模式

在這里插入圖片描述

復雜流處理示例
// 模擬用戶行為分析管道
Flux<UserEvent> userEvents = eventSource.getUserEvents();userEvents.filter(event -> event.getType() == EventType.PAGE_VIEW).window(Duration.ofMinutes(5))  // 5分鐘窗口.flatMap(window -> window.groupBy(UserEvent::getUserId)  // 按用戶分組.flatMap(userGroup -> userGroup.buffer(10)  // 每10個事件一批.map(events -> analyzeUserBehavior(events))).sample(Duration.ofSeconds(30))  // 每30秒取樣一次).onErrorResume(e -> {log.error("Processing error", e);return Flux.empty();}).subscribe(analysis -> {storeAnalysis(analysis);realtimeDashboard.update(analysis);});
背壓處理策略
Flux.range(1, 1000000).onBackpressureBuffer(1000,  // 緩沖區大小dropped -> log.warn("Dropped {} elements", dropped))  // 溢出處理.concatMap(i -> processItem(i),  // 模擬處理8               // 并發度).subscribe();// 另一種背壓策略 - 丟棄新元素
Flux.interval(Duration.ofMillis(10)).onBackpressureDrop(item -> log.debug("Dropping {}", item)).concatMap(i -> Mono.delay(Duration.ofMillis(100)).thenReturn(i),1).subscribe();

測試響應式流

在這里插入圖片描述
Reactor 提供了專門的測試工具:

@Test
void testFluxOperations() {StepVerifier.create(Flux.just("a", "b", "c").map(String::toUpperCase).filter(s -> s.startsWith("A"))).expectNext("A")  // 驗證下一個元素.verifyComplete(); // 驗證流正常結束
}@Test
void testErrorHandling() {StepVerifier.create(Flux.error(new RuntimeException("forced error")).onErrorResume(e -> Flux.just("recovered"))).expectNext("recovered").verifyComplete();
}@Test
void testVirtualTime() {StepVerifier.withVirtualTime(() -> Mono.delay(Duration.ofDays(1))  // 實際不會真的等待.thenAwait(Duration.ofDays(1))  // 虛擬時間前進.expectNext(0L).verifyComplete();
}

性能優化技巧

  1. 調度器選擇

    • Schedulers.parallel(): CPU密集型任務
    • Schedulers.boundedElastic(): I/O密集型任務
    • Schedulers.single(): 單線程執行
  2. 操作符組合

    // 不好的寫法 - 多次訂閱
    Flux<Integer> source = Flux.range(1, 10);
    source.filter(i -> i % 2 == 0).subscribe();
    source.map(i -> i * 2).subscribe();// 好的寫法 - 操作符鏈式調用
    Flux.range(1, 10).filter(i -> i % 2 == 0).map(i -> i * 2).subscribe();
    
  3. 熱發布與冷發布

    // 冷發布 - 每個訂閱者獲得獨立的數據流
    Flux<Integer> cold = Flux.range(1, 3).delayElements(Duration.ofSeconds(1));// 熱發布 - 多個訂閱者共享數據流
    ConnectableFlux<Integer> hot = Flux.range(1, 100).delayElements(Duration.ofMillis(100)).publish();
    hot.connect();  // 開始發射數據
    

通過掌握這些核心概念和操作符,您已經具備了構建復雜響應式系統的基礎能力。Reactor 的強大之處在于其豐富的操作符可以組合出幾乎無限的數據處理管道,同時保持代碼的聲明式和簡潔性。

在這里插入圖片描述


React 編程核心技巧與最佳實踐

React 作為現代前端開發的標桿框架,其編程技巧和最佳實踐對于構建高效、可維護的應用程序至關重要。以下是 React 開發中的關鍵技巧分類解析:

一、組件設計技巧

1. 組件拆分原則

  • 單一職責原則:每個組件只做一件事
  • 容器與展示分離:容器組件管理數據/邏輯,展示組件負責UI渲染
  • 合理劃分組件層級:避免"巨型組件"問題
// 不好的做法 - 混合邏輯與UI
const UserProfile = () => {const [user, setUser] = useState(null);useEffect(() => {fetchUser().then(data => setUser(data));}, []);return (<div>{user && (<><img src={user.avatar} /><h1>{user.name}</h1><p>{user.bio}</p></>)}</div>);
};// 好的做法 - 分離容器與展示
const UserProfileContainer = () => {const [user, setUser] = useState(null);useEffect(() => {fetchUser().then(data => setUser(data));}, []);return <UserProfileDisplay user={user} />;
};const UserProfileDisplay = ({ user }) => (<div>{user && (<><img src={user.avatar} /><h1>{user.name}</h1><p>{user.bio}</p></>)}</div>
);

2. 組件復用策略

  • 自定義Hooks:提取可重用邏輯
  • 高階組件(HOC):增強組件功能
  • Render Props:共享組件間代碼
// 自定義Hook示例
const useFetch = (url) => {const [data, setData] = useState(null);const [loading, setLoading] = useState(true);useEffect(() => {fetch(url).then(res => res.json()).then(data => {setData(data);setLoading(false);});}, [url]);return { data, loading };
};// 使用自定義Hook
const UserList = () => {const { data, loading } = useFetch('/api/users');if (loading) return <Spinner />;return <List items={data} />;
};

二、狀態管理技巧

1. 狀態提升與降級

  • 狀態提升:共享狀態移到最近的共同祖先
  • 狀態降級:使用組合避免不必要的prop drilling
// 狀態提升示例
const Parent = () => {const [count, setCount] = useState(0);return (<><ChildA count={count} /><ChildB setCount={setCount} /></>);
};// 狀態降級示例 - 使用組合
const Parent = () => {return (<Counter>{(count, setCount) => (<><Display count={count} /><Controls setCount={setCount} /></>)}</Counter>);
};

2. 復雜狀態管理

  • useReducer:適用于復雜狀態邏輯
  • Context API:跨組件樹共享狀態
  • 狀態管理庫:Redux/MobX等選擇
// useReducer示例
const initialState = { count: 0 };function reducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:throw new Error();}
}const Counter = () => {const [state, dispatch] = useReducer(reducer, initialState);return (<>Count: {state.count}<button onClick={() => dispatch({ type: 'decrement' })}>-</button><button onClick={() => dispatch({ type: 'increment' })}>+</button></>);
};

三、性能優化技巧

1. 減少不必要的渲染

  • React.memo:記憶化組件
  • useMemo/useCallback:記憶化值和函數
  • 避免內聯對象/函數:防止props不必要變化
// 優化前 - 每次渲染都創建新函數
const MyComponent = () => {const handleClick = () => console.log('Clicked');return <Child onClick={handleClick} />;
};// 優化后 - 使用useCallback
const MyComponent = () => {const handleClick = useCallback(() => console.log('Clicked'), []);return <Child onClick={handleClick} />;
};// 列表項優化
const MemoizedListItem = React.memo(({ item }) => {return <li>{item.name}</li>;
});const List = ({ items }) => {return (<ul>{items.map(item => (<MemoizedListItem key={item.id} item={item} />))}</ul>);
};

2. 虛擬化長列表

  • react-windowreact-virtualized
  • 只渲染可視區域內的元素
import { FixedSizeList as List } from 'react-window';const Row = ({ index, style }) => (<div style={style}>Row {index}</div>
);const LongList = () => (<Listheight={500}itemCount={1000}itemSize={35}width={300}>{Row}</List>
);

四、Hooks高級技巧

1. 自定義Hooks模式

  • 提取通用邏輯:如數據獲取、表單處理
  • 組合基礎Hooks:構建復雜行為
// 表單處理Hook
const useForm = (initialValues) => {const [values, setValues] = useState(initialValues);const handleChange = (e) => {const { name, value } = e.target;setValues(prev => ({ ...prev, [name]: value }));};const resetForm = () => setValues(initialValues);return { values, handleChange, resetForm };
};// 使用自定義表單Hook
const LoginForm = () => {const { values, handleChange } = useForm({ email: '', password: '' });return (<form><inputname="email"value={values.email}onChange={handleChange}/><inputname="password"type="password"value={values.password}onChange={handleChange}/></form>);
};

2. 副作用管理

  • 依賴數組精確控制:避免不必要執行
  • 清理副作用:返回清理函數
  • 競態條件處理:使用取消標記
// 競態條件處理示例
useEffect(() => {let didCancel = false;const fetchData = async () => {const result = await fetchSomeData(id);if (!didCancel) {setData(result);}};fetchData();return () => {didCancel = true;};
}, [id]);

五、TypeScript集成技巧

1. 類型定義最佳實踐

  • 組件Props類型:明確接口
  • 泛型組件:創建靈活組件
  • 類型工具:使用Utility Types
interface User {id: number;name: string;email: string;
}interface UserListProps {users: User[];onSelectUser: (user: User) => void;isLoading?: boolean;
}const UserList: React.FC<UserListProps> = ({ users, onSelectUser,isLoading = false 
}) => {// 組件實現
};// 泛型組件示例
interface ListProps<T> {items: T[];renderItem: (item: T) => React.ReactNode;
}function List<T>({ items, renderItem }: ListProps<T>) {return (<ul>{items.map((item, index) => (<li key={index}>{renderItem(item)}</li>))}</ul>);
}

六、測試技巧

1. 單元測試策略

  • React Testing Library:測試組件行為
  • Jest:斷言和快照測試
  • Mock依賴:隔離測試環境
import { render, screen, fireEvent } from '@testing-library/react';
import Counter from './Counter';test('increments counter when + button is clicked', () => {render(<Counter />);const counter = screen.getByText('0');const incrementBtn = screen.getByText('+');fireEvent.click(incrementBtn);expect(counter.textContent).toBe('1');
});// 異步測試示例
test('loads and displays user data', async () => {render(<UserProfile userId="1" />);expect(screen.getByText(/loading/i)).toBeInTheDocument();await screen.findByText(/John Doe/i);expect(screen.queryByText(/loading/i)).not.toBeInTheDocument();
});

七、架構與模式

1. 設計系統集成

  • 組件庫構建:Storybook驅動開發
  • 主題化方案:CSS-in-JS或CSS變量
  • 設計Token管理:統一樣式規范
// 使用ThemeProvider (styled-components示例)
const theme = {colors: {primary: '#007bff',secondary: '#6c757d',},spacing: (factor) => `${4 * factor}px`,
};const Button = styled.button`background: ${({ theme }) => theme.colors.primary};padding: ${({ theme }) => theme.spacing(2)};
`;const App = () => (<ThemeProvider theme={theme}><Button>Primary Button</Button></ThemeProvider>
);

2. 微前端集成

  • 模塊聯邦:Webpack 5特性
  • 單SPA框架:集成多個框架
  • 組件共享:跨應用復用
// Module Federation配置示例 (webpack.config.js)
module.exports = {plugins: [new ModuleFederationPlugin({name: 'app1',remotes: {app2: 'app2@http://localhost:3002/remoteEntry.js',},shared: ['react', 'react-dom'],}),],
};// 使用遠程組件
const RemoteButton = React.lazy(() => import('app2/Button'));const App = () => (<React.Suspense fallback="Loading Button..."><RemoteButton /></React.Suspense>
);

八、調試技巧

1. 高效調試工具

  • React DevTools:組件樹檢查
  • Redux DevTools:狀態時間旅行
  • 自定義Hooks調試:useDebugValue
// 使用useDebugValue
const useFriendStatus = (friendID) => {const [isOnline, setIsOnline] = useState(null);// 在DevTools中顯示自定義標簽useDebugValue(isOnline ? 'Online' : 'Offline');useEffect(() => {const handleStatusChange = (status) => {setIsOnline(status.isOnline);};ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);return () => {ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);};}, [friendID]);return isOnline;
};

2. 錯誤邊界處理

  • componentDidCatch:捕獲子組件錯誤
  • 錯誤恢復策略:提供備用UI
class ErrorBoundary extends React.Component {state = { hasError: false };static getDerivedStateFromError(error) {return { hasError: true };}componentDidCatch(error, errorInfo) {logErrorToService(error, errorInfo);}render() {if (this.state.hasError) {return <FallbackUI />;}return this.props.children; }
}// 使用錯誤邊界
const App = () => (<ErrorBoundary><ComponentThatMayError /></ErrorBoundary>
);

掌握這些React編程技巧將顯著提升您的開發效率、代碼質量和應用性能。隨著React生態系統的不斷發展,持續學習和實踐新的模式和最佳實踐是成為React專家的關鍵。

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

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

相關文章

【萬字總結】前端全方位性能優化指南(完結篇)——自適應優化系統、遺傳算法調參、Service Worker智能降級方案

前言 自適應進化宣言 當監控網絡精準定位病灶&#xff0c;真正的挑戰浮出水面&#xff1a;系統能否像生物般自主進化&#xff1f; 五維感知——通過設備傳感器實時捕獲環境指紋&#xff08;如地鐵隧道弱光環境自動切換省電渲染&#xff09; 基因調參——150個性能參數在遺傳算…

PQ以及有關索引的筆記Faiss: The Missing Manual

參考Faiss 索引結構總結&#xff1a; 為了加深記憶&#xff0c;介紹一下Inverted File Index&#xff08;IVF&#xff09;的名字由來&#xff1a; IVF索引的名字源自“倒排文件”&#xff08;Inverted File&#xff09;的概念。在傳統的信息檢索中&#xff0c;倒排文件是一種索…

win10徹底讓圖標不顯示在工具欄

關閉需要不顯示的軟件 打開 例此時我關閉了IDEA的顯示 如果說只是隱藏&#xff0c;鼠標拖動一個道理 例QQ 如果說全部顯示不隱藏

關稅核爆72小時!跨境矩陣防御戰緊急打響

一、T86崩塌&#xff1a;全球貿易鏈的至暗時刻 &#xff08;配圖&#xff1a;美國海關系統深夜彈出紅色警報&#xff09; 5月2日凌晨2:17&#xff0c;杭州某光伏企業的供應鏈系統突然發出刺耳警報——其價值1800萬美元的逆變器模塊被劃入34%關稅清單。這場代號"黑天鵝突…

藍橋杯Java B組省賽真題題型近6年統計分類

困難題 題號題型分值代碼量難度通過率內容2024-F解答1581困難0.12最短路問題 Dijkstra 期望2024-G解答20116困難0.19模擬 暴力 搜索 DFS 剪紙 枚舉2023-H解答2070困難0動態規劃2022-H解答20109困難0.032022-J解答25141困難0搜索2021-H解答2041困難0.18二分 思維 規律2021-I解答…

【網絡流 圖論建模 最大權閉合子圖】 [六省聯考 2017] 壽司餐廳

題目描述&#xff1a; P3749 [六省聯考 2017] 壽司餐廳 題目描述 Kiana 最近喜歡到一家非常美味的壽司餐廳用餐。 每天晚上&#xff0c;這家餐廳都會按順序提供 n n n 種壽司&#xff0c;第 i i i 種壽司有一個代號 a i a_i ai? 和美味度 d i , i d_{i, i} di,i?&…

前端面試題(三):axios有哪些常用的方法

Axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;用于瀏覽器和 Node.js 中發送 HTTP 請求。它提供了一些常用的方法來處理不同類型的請求。以下是 Axios 中常用的一些方法&#xff1a; 1. axios.get() 用于發送 GET 請求&#xff0c;從服務器獲取數據。 axios.get(/api/d…

python match case語法

學習路線&#xff1a;B站 普通的if判斷 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …

LLaMA-Factory大模型微調全流程指南

該文檔為LLaMA-Factory大模型微調提供了完整的技術指導&#xff0c;涵蓋了從環境搭建到模型訓練、推理和合并模型的全流程&#xff0c;適用于需要進行大模型預訓練和微調的技術人員。 一、docker 容器服務 請參考如下資料制作 docker 容器服務&#xff0c;其中&#xff0c;掛…

【HCIA】靜態綜合實驗練習筆記

實驗拓撲圖如下&#xff1a; 實驗配置思路如下&#xff1a; 1、網段劃分、配置IP地址 2、配置DHCP&#xff0c;使客戶端獲得ip地址 3、配置靜態明細路由&#xff0c;內網全網通 4、配置空接口防環 5、配置優先級&#xff0c;實現選路最佳 6、配置缺省路由&#xff0c;實現公網通…

大數據(4.5)Hive聚合函數深度解析:從基礎統計到多維聚合的12個生產級技巧

目錄 背景一、Hive聚合函數分類與語法1. 基礎聚合函數2. 高級聚合函數 二、6大核心場景與案例場景1&#xff1a;基礎統計&#xff08;SUM/COUNT&#xff09;場景2&#xff1a;多維聚合&#xff08;GROUPING SETS&#xff09;場景3&#xff1a;層次化聚合&#xff08;ROLLUP&…

RTOS基礎 -- NXP M4小核的RPMsg-lite與端點機制回顧

一、RPMsg-lite與端點機制回顧 在RPMsg協議框架中&#xff1a; Endpoint&#xff08;端點&#xff09; 是一個邏輯通信端口&#xff0c;由本地地址&#xff08;local addr&#xff09;、遠程地址&#xff08;remote addr&#xff09;和回調函數組成。每個消息都會發送到特定的…

NineData云原生智能數據管理平臺新功能發布|2025年3月版

本月發布 15 項更新&#xff0c;其中重點發布 3 項、功能優化 11 項、性能優化 1 項。 重點發布 基礎服務 - MFA 多因子認證 新增 MFA 多因子認證&#xff0c;提升賬號安全性。系統管理員開啟后&#xff0c;所有組織成員需綁定認證器&#xff0c;登錄時需輸入動態驗證碼。 數…

DAY 35 leetcode 202--哈希表.快樂數

題號202 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和。然后重復這個過程直到這個數變為 1&#xff0c;也可能是 無限循環 但始終變不到 1。如果這個過程 結果為 1&a…

Maven+Spring實現后端開發

一、前置知識的介紹 1.Spring 輕量級的 DI / IoC 和 AOP 容器的開源框架 容器的開源框架網址&#xff1a;https://spring.io/projects/spring-framework 作用&#xff1a;可簡化管理創建和組裝對象之間的依賴關系 將controller----->service------->dao層的依賴配置…

解鎖界面設計密碼,打造極致用戶體驗

界面設計是對軟件、網站、移動應用等產品的用戶界面進行設計的過程&#xff0c;旨在為用戶提供美觀、易用、高效的交互體驗。以下是關于界面設計的一些主要方面&#xff1a; 一、設計原則 用戶中心原則&#xff1a;以用戶為中心&#xff0c;了解用戶的需求、期望、行為和習慣…

Joint Receiver Design for Integrated Sensing and Communications

摘要——在本文中&#xff0c;我們研究了集成感知與通信(ISAC)系統的聯合接收機設計&#xff0c;其中通信信號和目標回波信號同時被接收和處理&#xff0c;以在兩種功能之間實現平衡性能。特別地&#xff0c;我們提出了兩種設計方案來解決聯合感知和通信問題中的接收信號處理。…

DeepSeek接入飛書多維表格,效率起飛!

今天教大家把DeepSeek接入飛書表格使用。 準備工作&#xff1a;安裝并登錄飛書&#xff1b;可以準備一些要處理的數據&#xff0c;確保數據格式正確&#xff0c;如 Excel、CSV 等&#xff0c;也可直接存儲到飛書多維表格。 創建飛書多維表格&#xff1a;打開飛書&#xff0c;點…

【C語言入門】由淺入深學習指針 【第二期】

目錄 1. 指針變量為什么要有類型&#xff1f; 2. 野指針 2.1 未初始化導致的野指針 2.2 指針越界導致的野指針 2.3 如何規避野指針 3. 指針運算 3.1 指針加減整數 3.2 指針減指針 3.3 指針的關系運算 4. 二級指針 5. 指針數組 5.1 如何使用指針數組模擬二維數組 上…

OpenCV 圖形API(13)用于執行兩個矩陣(或圖像)逐元素乘法操作的函數mul()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 描述 計算兩個矩陣的每個元素的縮放乘積。 mul函數計算兩個矩陣的逐元素乘積&#xff1a; dst ( I ) saturate ( scale ? src1 ( I ) ? src2 ( I ) ) …