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.mzph.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 ) ) …