🚀 Java Streams – Complete Cheat Sheet (Save This 📌) Still struggling with Java Streams? Here’s everything you need in one place 👇 💡 Stream Pipeline: Source → Intermediate → Terminal 🔹 Intermediate Operations: ✔ filter() -👉 Keeps only elements that match a condition Ex: filter(x -> x>10) ✔ map() - 👉 Transforms each element into something else Ex: map(x -> x*2) ✔ flatMap() - 👉 Flattens nested structures (List of Lists → single list) Ex: List<List<String>> list=List.of(List.of("A", "B"),List.of("C", "D")); list. stream() .flatMap(Collection::stream) ✔ distinct() - 👉 Removes duplicate elements Ex: list. stream().distinct().forEach(System.out::println) ✔ sorted() -👉 Sorts elements (default or custom) Ex: list. stream().sorted().forEach(System.out::println); ✔ limit() / skip() - 👉 Takes first n elements / 👉 Skips first n elements Ex: list. stream().limit(3).forEach(System.out::println); // 1, 2, 3 list. stream().skip(2).forEach(System.out::println); // 3, 4, 5 ✔ peek() - 👉 Performs action without modifying data Ex: .peek(x -> System.out.println("Processing: "+x)) ✔ takeWhile() / dropWhile() (Java9+) -👉 Takes elements until condition becomes false / 👉 Skips elements until condition becomes false Ex: List<Integer> list=List.of(1, 2, 3, 0, 4, 5); list. stream() .takeWhile(x -> x>0).forEach(System.out::println); // 1, 2, 3 list. stream() .dropWhile(x -> x>0).forEach(System.out::println); // 0, 4, 5 🔹 Terminal Operations: ✔ forEach() - 👉 Iterates over elements Ex: list. stream().forEach(System.out::println); ✔ collect() - 👉 Converts stream into collection (List, Set, Map) Ex: List<Integer> result = list. stream().filter(x -> x > 2).collect(Collectors.toList()); ✔ count() - 👉 Returns number of elements Ex: long count = list. stream().filter(x -> x > 2).count(); ✔ min() / max() - 👉 Finds smallest / largest element Ex: int min = list. stream().min(Comparator.naturalOrder()).get(); int max = list. stream() .max(Comparator.naturalOrder()).get(); ✔ findFirst() / findAny() - 👉 Returns first or any element Ex: Optional<Integer> first = list. stream() .findFirst(); Optional<Integer> any = list.stream() .findAny(); ✔ anyMatch() / allMatch() / noneMatch() - 👉 Returns true if any element matches condition / 👉 Returns true if all elements match / 👉 Returns true if no elements match Ex: boolean any = list. stream() .anyMatch(x -> x > 3); boolean all = list. stream() .allMatch(x -> x > 0); boolean none = list. stream() .noneMatch(x -> x < 0); ✔ reduce() - 👉 Combines all elements into one result Ex: int sum = list. stream() .reduce(0, (a, b) -> a + b); // sum of elements 🔥 Example: List<String> result=employees. stream() .filter(e -> e.getSalary() >30000) // filter .map(Employee::getName) // map .distinct() // remove duplicates .sorted() // sort .limit(3) // limit .collect(Collectors.toList()); // collect 👉 Save for interviews & daily coding #Java #JavaStreams #SpringBoot #BackendDevelopment #CodingTips #Developers #InterviewCheatSheat
Java Streams Cheat Sheet: Master Intermediate and Terminal Operations
More Relevant Posts
-
Mastering Java Streams: What’s Actually Happening Under the Hood? Ever wondered why Java Streams are called "Lazy"? Or why adding more intermediate operations doesn't necessarily slow down your code? The secret lies in the Internal Flow. Unlike traditional Collections, Streams don't process data step-by-step for the entire list. Instead, they use a Single-Pass Execution model. 🏗️ The 3 Stages of a Stream The Source: Where the data comes from (Lists, Sets, Arrays). Intermediate Operations: These are Lazy. Operations like .filter() or .map() don’t execute immediately. They just build a "recipe" or a pipeline of instructions. Terminal Operations: This is the Trigger. Operations like .collect(), .findFirst(), or .forEach() start the engine. Without this, nothing happens. 🧠 The "Pull" Mechanism Java Streams don't "push" every element through the entire pipeline one by one. Instead, the Terminal Operation "pulls" data from the source through the pipeline. Imagine a factory line: instead of moving every item to the next station, the worker at the very end of the line asks for one finished product. This triggers the previous stations to work only as much as needed to produce that one item. 💻 Code in Action: Lazy Evaluation & Short-Circuiting Check out this example. Even though we have a list of 1,000 items, the stream only processes what it needs. List<String> names = Arrays.asList("Java", "Spring", "Hibernate", "Microservices", "Docker"); String result = names.stream() .filter(s -> { System.out.println("Filtering: " + s); return s.length() > 4; }) .map(s -> { System.out.println("Mapping: " + s); return s.toUpperCase(); }) .findFirst() // Terminal Operation .get(); System.out.println("Result: " + result); What happens here? It checks "Java" (fails filter). It checks "Spring" (passes filter). It immediately maps "Spring" to "SPRING". findFirst() is satisfied, so it stops. It never even looks at "Hibernate" or "Docker"! 💡 Why does this matter for your LinkedIn reach? (and your code) Performance: Drastically reduces unnecessary computations. Memory Efficiency: Processes elements in a single pass rather than creating intermediate data structures. Readability: Clean, declarative code that describes what to do, not how to do it. Which do you prefer? The classic for-loop or the Stream API? Let's discuss in the comments! 👇 #Java #Programming #SoftwareDevelopment #Backend #JavaStreams #CleanCode #TechTips
To view or add a comment, sign in
-
-
🚀 Java Evolution: From Java 8 to Java 25 (LTS) – Don’t Call It “Old” Yet! 👀 Think Java is just a relic of the past? Think again. It’s quietly become one of the most modern, scalable, and developer-friendly languages out there. Let’s take a whirlwind tour of its transformation. Buckle up! 🔍 🔹 Java 8 – The Revolution Begins (2014) This is where Java stopped being “that verbose enterprise thing” and started flexing. ✅ Lambdas & Functional Programming: Say hello to cleaner, expressive code. ✅ Stream API: Data processing got a functional makeover. ✅ Date & Time API: Finally, no more Calendar class nightmares. 🔹 Java 11 – Polished & Production-Ready (2018) Java shed some baggage and became a smoother ride. ✅ Standard HTTP Client: Networking without the third-party hassle. ✅ String & API Enhancements: Small tweaks, big quality-of-life wins. ✅ Developer Experience: Less friction, more focus. 🔹 Java 17 (LTS) – The Modern Backbone (2021) The go-to for most companies today. It’s stable, modern, and packed with goodies. ✅ Records: Boilerplate? What boilerplate? Data classes made easy. ✅ Sealed Classes: Control your inheritance like a pro. ✅ Pattern Matching for instanceof: Cleaner, smarter type checks. 🔹 Java 21 (LTS) – Concurrency King (2023) This is where Java redefined scalability. Mind-blowing stuff. ✅ Virtual Threads (Project Loom): Handle thousands of threads without breaking a sweat. ✅ Pattern Matching for switch: Logic so clean, it’s almost poetic. ✅ Sequenced Collections: Ordered data structures, done right. 🔹 Java 22 – Refining the Craft (2024) Java keeps trimming the fat, making life easier for devs. ✅ Unnamed Variables & Patterns: Less typing, more doing. ✅ Stream API Enhancements: Even more power for data wrangling. ✅ String Templates (Preview): Formatting strings without the mess. 🔹 Java 25 (LTS) – Future-Proofed & Ready (2025) The next frontier (based on current roadmaps and speculation). ✅ Advanced Pattern Matching: Code that reads like plain English. ✅ Performance & Garbage Collection Boosts: Faster, leaner, meaner. ✅ Virtual Thread Ecosystem: Concurrency on steroids. ✅ Expressive Syntax: Java, but somehow even prettier. 💡 Key Takeaway from This Journey: Java isn’t just about “write once, run anywhere” anymore. It’s a powerhouse of performance, scalability, and developer productivity. Ignore the memes – this language is thriving. 📌 If You’re Learning Java Today: Master Java 17 for a solid foundation (it’s the current LTS sweet spot). Get comfy with Java 21 for cutting-edge features like Virtual Threads. Keep an eye on Java 25 – it’s where the future is heading. 👇 Drop a Comment: Which Java version are you rocking right now? Are you hyped for Java 25, or sticking with the tried-and-true? Let’s chat! #Java #SoftwareEngineering #BackendDevelopment #JavaDeveloper #Programming #Coding #Tech #Developers #Learning #CareerGrowth
To view or add a comment, sign in
-
-
...........🅾🅾🅿🆂 !!! 𝑷𝒍𝒂𝒕𝒇𝒐𝒓𝒎 卩卂尺 𝑺𝒊𝒎𝒓𝒂𝒏 𝙎𝙚 𝕄𝕦𝕝𝕒𝕜𝕒𝕥 🅷🆄🅸, but 🆁🅾🅱🆄🆂🆃 𝔸𝕣𝕦𝕟 nikla D͓̽i͓̽l͓̽ ka 🅳🆈🅽🅰🅼🅸🅲......!!!.............. Guys you must be wondering, what nonsense things am I writing...."kuch shaayar likhna hai toa kaahi aur likh, linkedin pe kiyu"??? But guess what.....the above phrase represents features of java: 🅾🅾🅿🆂:- 𝗢𝗯𝗷𝗲𝗰𝘁 𝗢𝗿𝗶𝗲𝗻𝘁𝗲𝗱 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴 ....'S' is just a connect letter...don't consider it... 𝑷𝒍𝒂𝒕𝒇𝒐𝒓𝒎:- 𝗣𝗹𝗮𝘁𝗳𝗼𝗿𝗺 𝗶𝗻𝗱𝗲𝗽𝗲𝗻𝗱𝗲𝗻𝘁.....java apps doesn't need to be recoded if you change the operating system😇😇😇 卩卂尺:- the word "par" sounds similiar to "por" and you can then call it 𝗣𝗼𝗿𝘁𝗮𝗯𝗹𝗲...Definitely platform independence makes java portable 𝑺𝒊𝒎𝒓𝒂𝒏:- Either you can say Simran sounds similiar to simple, hence 𝗦𝗶𝗺𝗽𝗹𝗲 is another feature....or say Simran is a very 𝗦𝗶𝗺𝗽𝗹𝗲 girl... 𝕄𝕦𝕝𝕒𝕜𝕒𝕥:- To say Mulakat, you need to say "Mul"...and at the end you are also using a "t"......guess it guess it.....yes it is 𝑴𝒖𝒍𝒕𝒊 𝑻𝒉𝒓𝒆𝒂𝒅𝒊𝒏𝒈....you will love smaller tasks in your programs into individual threads and then executing them concurrently to save your time.... 🅷🆄🅸:- doesn't "Hui" sound almost similiar to "high" I know there is a lot difference but say you are requiring same energy....just you can say "Hui" se 𝙃𝙞𝙜𝙝 𝙋𝙚𝙧𝙛𝙤𝙧𝙢𝙖𝙣𝙘𝙚.....ofcourse java gives a High level of performance as it is 𝑱𝒖𝒔𝒕 𝒊𝒏 𝒕𝒊𝒎𝒆 𝒄𝒐𝒎𝒑𝒊𝒍𝒆𝒅.... 🆁🅾🅱🆄🆂🆃:- Yes ofcourse java is 𝗥𝗼𝗯𝘂𝘀𝘁 because of its strong memory management..... 𝔸𝕣𝕦𝕟:- Arun contains "A" and "N".....Arun se 𝘼𝙧𝙘𝙝𝙞𝙩𝙚𝙘𝙩𝙪𝙧𝙖𝙡 𝙉𝙚𝙪𝙩𝙧𝙖𝙡....right??? Size of all data types in java is same for both 32 bit compiler as well as 64 bit compiler D͓̽i͓̽l͓̽ :- "Dil" had "DI" and "DI" se 𝗗𝗶𝘀𝘁𝗿𝗶𝗯𝘂𝘁𝗲𝗱...java Applications can be distributed and run at the same time on diff computers in same network 🅳🆈🅽🅰🅼🅸🅲:- Yes Java is also 𝗗𝘆𝗻𝗮𝗺𝗶𝗰 due to it's Dynamic class loading feature.... Just repeat the above phrase 2 to 3 times and you will be ablte to retain all the features of java untill you take your last breath.......100% guarantee....
To view or add a comment, sign in
-
#SLF4J When I first started learning Java and Spring Boot, I kept seeing SLF4J everywhere. At first, I thought it was just another logging tool… but I was wrong. What I learned is: SLF4J (Simple Logging Facade for Java) is not a logging framework. It’s actually a bridge between my code and different logging frameworks. Whenever I write something like: logger.info("Application started"); I’m not directly using Logback or Log4j. Instead: My code → goes to SLF4J → then SLF4J forwards it → to the actual logging framework So SLF4J acts like a middleman. Earlier, I used to think: “If I use Log4j today and later want to switch to Logback, I’ll have to change all my code.” But with SLF4J, I don’t need to do that at all. I just change the dependency My logging code stays exactly the same That’s when I realized how powerful this is. Now: If I use Logback, logs will go there If I switch to Log4j, logs will go there My code does not change at all One more thing I found useful (Log Levels): SLF4J supports different log levels, which helped me control what gets printed: trace() → very detailed (rarely used) debug() → for debugging info() → general information warn() → something might be wrong error() → something failed Example: logger.debug("User details: " + user); Instead of writing: logger.info("User name is " + name); I learned to write: logger.info("User name is {}", name); This improves performance Avoids unnecessary string creation This confused me initially If I only use SLF4J and don’t add any logging implementation (like Logback), then: Logs won’t be printed Or you may see a warning like: “No SLF4J providers were found” So we always need: SLF4J (API) One logging implementation (Logback / Log4j) Real-life analogy that clicked for me: I think of SLF4J like Google Maps I just enter the destination (log message), and it decides the best route (logging framework) to send it. I don’t worry about the internal path. When I started using it: Once I moved to Spring Boot projects, I noticed SLF4J is already used by default (with Logback). That made my life easier because I didn’t have to worry about logging setup much. SLF4J made my code cleaner, flexible, and future-proof. It also helped me follow industry best practices without much extra effort.
To view or add a comment, sign in
-
-
☕ How Java Actually Works — from source code to running application. Most developers use Java daily without knowing this. After 10+ years of building enterprise Java systems, understanding what happens under the hood has made me a dramatically better engineer. Let me walk through every stage 👇 📝 Stage 1 — Source You write Java code in your editor — IntelliJ, VS Code, Eclipse. That code is saved as a .java source file. Human-readable. Platform-specific to nothing yet. This is where it all begins. ⚙️ Stage 2 — Compile The Java Compiler (javac) transforms your .java source file into Bytecode — a .class file. This is the magic of Java's "Write Once Run Anywhere" promise. The bytecode is not native machine code — it's an intermediate language that any JVM on any platform can understand. Windows, Linux, Mac — same bytecode runs everywhere. 📦 Stage 3 — Artifacts The compiled .class files are packaged into artifacts — JAR files, modules, or classpath entries. In enterprise projects I've shipped across Bank of America and United Health, Maven and Gradle manage this — producing versioned artifacts deployed to Nexus or AWS CodeArtifact repositories. 📂 Stage 4 — Load The Class Loader loads .class files, JARs, and modules into the Java Runtime Environment at runtime. Three built-in class loaders handle this — Bootstrap, Extension, and Application. Understanding class loading has helped me debug NoClassDefFoundError and ClassNotFoundException in production more times than I can count. 🔍 JVM — Verify Before executing a single instruction, the JVM Verifier checks the bytecode for correctness and security violations. No invalid memory access. No type violations. No corrupted bytecode. This is one reason Java is inherently safer than languages with direct memory management. ▶️ Stage 5 — Execute — Interpreter + JIT Compiler This is where performance gets interesting. The JVM first Interprets bytecode line by line — fast startup, moderate throughput. Simultaneously it monitors execution and identifies hot paths — code that runs frequently. Those hot paths are handed to the JIT (Just-In-Time) Compiler which compiles them to native machine code stored in the Code Cache. 🏃 Stage 6 — Run The JVM runs a mix of interpreted bytecode and JIT-compiled native code — balancing startup speed with peak performance. Standard Libraries (java.* / jdk.*) provide everything from collections to networking to I/O throughout execution. #Java #c2c #opentowork #c2h #JVM #CoreJava #JavaDeveloper #SpringBoot #JVMPerformance #FullStackDeveloper #OpenToWork #BackendDeveloper #Java17 #HiringNow #EnterpriseJava #SoftwareEngineer #JITCompiler #JavaInterview #CloudNative #Microservices #TechEducation #Programming
To view or add a comment, sign in
-
-
Optional Misuse Patterns in Java: The Problem: A user lookup crashes in production with NoSuchElementException. The developer is confused — they used Optional, so it should be safe. But they called .get() directly without checking if the value is present. The Optional wrapper added zero safety. Root Cause: Optional was introduced in Java 8 to make absent values explicit and force callers to handle the empty case. But calling .get() on an empty Optional throws NoSuchElementException — just as calling a method on null throws NullPointe java User u = userRepo.findById(id).get(); That one line is no safer than a null dereference. Optional.get() on an empty Optional throws NoSuchElementException. Calling a method on null throws NullPointerException. Different exception, identical outcome. The Optional wrapper added zero protection. Optional was introduced to make absence explicit and force the caller to handle it. But calling .get() skips the entire contract. You have paid the ceremony tax with zero safety benefit. The other anti-pattern is isPresent() + get() — it works, but it is just a verbose null check. The same bug is still possible if someone removes the isPresent() guard later. Three correct patterns: java // 1 — fail with a meaningful exception (service layer default) .orElseThrow(() -> new UserNotFoundException(id)) // 2 — provide a safe default .orElse(User.anonymous()) // 3 — return Optional to caller, let them decide return userRepo.findById(id); Prevention Checklist: ->Never call Optional.get() without an explicit guard ->Prefer orElseThrow() at service layer — fail fast with meaningful exception ->Use orElseGet() instead of orElse() when the default is expensive to create ->Return Optional<T> from repo/service when absence is expected and valid ->Never use Optional as a method parameter or entity field — only as return type ->Enable IntelliJ inspection: "Optional.get() without isPresent()" Lesson: Optional.get() without a guard is just a different way to write a NPE. Optional forces you to think about the empty case — use its API to handle it. orElseThrow() for service layers. orElse() for defaults. Return Optional when absence is valid. Never call .get() directly. It is not a safe operation. #Java #DataStructures #DSA #SystemDesign #SpringBoot #BackendDevelopment #SoftwareEngineering #JavaDeveloper #Programming
To view or add a comment, sign in
-
-
🚨 This Java code looks 100% illegal. But it compiles. It runs. And it does something MAGICAL. outer: for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == 1 && j == 1) { break outer; // ← THIS LOOKS WRONG! } System.out.println(i + "," + j); } } Output: 0,0 0,1 0,2 1,0 Then it STOPS. Completely. Both loops. Gone. 💨 First time I saw this I thought: ❌ Is "outer" a variable? ❌ Is this some framework keyword? ❌ Did someone hack Java?! Nope. This is 100% pure Java. And it's called ➡️ Labeled break ━━━━━━━━━━━━━━━━━━ 🔍 What is happening here? ━━━━━━━━━━━━━━━━━━ Normally break only exits the INNER loop. But what if you want to break out of the OUTER loop from deep inside nested loops? Java gives you a secret weapon: You can NAME a loop with a label! outer: ← this names the outer loop Then break outer instantly kills BOTH loops no matter how deep you are! 🎯 Same trick works with continue: outer: for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (j == 1) { continue outer; // skips to next i! } System.out.println(i + "," + j); } } Output: 0,0 1,0 2,0 continue outer skips the rest of the INNER loop and jumps straight to the next iteration of OUTER! 🤯 ━━━━━━━━━━━━━━━━━━ 💡 When to use this? ━━━━━━━━━━━━━━━━━━ ✅ Searching in a 2D matrix — stop when found ✅ Parsing nested data — skip entire blocks ✅ Game loops — exit multiple layers cleanly ✅ Any time nested breaks make your code messy I am a Java beginner and this blew my mind today. Imagine dropping this in a Java interview! 🏆 Most senior developers I showed this to said: "Wait... Java can do THAT?!" Comment "LABEL" if you already knew this! Comment "MIND BLOWN" if you didn't! 👇 Follow me — I find Java secrets that nobody talks about. 🚀 #Java #JavaDeveloper #JavaTips #HiddenJava #JavaMagic #CodingSecrets #JavaInterview #LearnJava #Programming #SoftwareDevelopment
To view or add a comment, sign in
-
💡 Java Basics Made Clear: `.equals()` vs `.hashCode()` (Plus a Spring Shortcut 🚀) This is one concept that looks simple—but can cause real bugs if misunderstood. 👉 What does `.equals()` do? It checks if two objects have the **same data (same content)**. 👉 What does `.hashCode()` do? It gives a **number (hash value)** that helps Java quickly find objects in collections like HashSet or HashMap. --- ⚠️ The Common Mistake: If you override `.equals()` but NOT `.hashCode()`, Java behaves unexpectedly. 👇 Example: ```java import java.util.*; class Person { String name; Person(String name) { this.name = name; } @Override public boolean equals(Object o) { return ((Person) o).name.equals(this.name); } } public class Test { public static void main(String[] args) { Set<Person> set = new HashSet<>(); set.add(new Person("Kartik")); set.add(new Person("Kartik")); System.out.println(set.size()); // ❌ Output: 2 (Should be 1) } } ``` 🤔 Why? * `.equals()` says both objects are SAME ✅ * But `.hashCode()` is different ❌ * So Java treats them as different objects --- ✅ The Fix: ```java @Override public int hashCode() { return name.hashCode(); } ``` ✔ Now output → `1` (Correct) --- 🚀 Spring / Lombok Shortcut (Best Practice) Instead of manually writing both methods, you can use Lombok: ```java import lombok.*; @Data class Person { private String name; } ``` 👉 `@Data` automatically generates: * `.equals()` * `.hashCode()` * getters, setters, and more You can also use: ```java @EqualsAndHashCode ``` 📌 This avoids human error and keeps code clean. --- 📌 Simple Rule: If two objects are equal using `.equals()` ➡️ They MUST have the same `.hashCode()` --- 🚀 Final Takeaway: * `.equals()` → checks equality * `.hashCode()` → helps in fast lookup * Always override BOTH or use Lombok annotations --- #Java #SpringBoot #Lombok #BackendDevelopment #CodingBestPractices #Developers
To view or add a comment, sign in
-
Everyone talks about orchestration in Python. But Java is no longer standing on the sidelines. It now has a serious framework story of its own. What changed is not just the arrival of a few new libraries. What changed is that Java is starting to support the parts that actually matter in real systems: stateful flows multi-step orchestration tool execution persistence observability enterprise integration That is a very different conversation from simply calling a model inside a REST API. If you look at the Java ecosystem now, three options stand out: Koog A JVM-native option built around workflow strategies, persistence, and enterprise-friendly integration. LangGraph4j A strong choice for graph-based, stateful workflows and multi-step orchestration in Java. Spring AI A practical fit for teams already working in Spring, especially when the goal is to introduce routing, orchestration patterns, and controlled workflow design without forcing a major stack change. This is why I think the Java story is getting more interesting. Python still moves faster for experimentation. But Java is shaping up as a very strong place to build systems that need to be operated, observed, governed, and maintained over time. And that matters more than people admit. Because most enterprise teams are not asking: “How fast can we demo this?” They are asking: “How do we run this in production?” “How do we recover when a step fails?” “How do we trace decisions across services?” “How do we fit this into the stack we already have?” That is exactly where Java starts to become very compelling. The conversation is no longer Python or nothing. Java is building its own path — and this time, it looks real. https://lnkd.in/g5vVK26H #Java #SpringAI #LangGraph4j #Koog #SpringBoot #SoftwareArchitecture #EnterpriseArchitecture #JVM #AgentOrchestration #SoftwareEngineering
To view or add a comment, sign in
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development